• PHP постоянный обмен при исполнении кода?

    @MadridianFox
    Web-программист, многостаночник
    отправили пост запрос через js он вернул результат только 1 раз

    Это естественно. Протокол HTTP именно так и устроен: запрос - ответ. Причём ответ сначала вычисляется, а затем отправляется клиенту.
    у меня работает foreach в php и при каждом завершении цикла я хочу получать результат

    Как уже написано выше - сначала код полностью отрабатывает, а потом результат отправляется клиенту. Вы не можете отправить клиенту данные и продолжить работу используя HTTP.
    или есть какой то обработчик получения return ?

    Нет.

    В итоге остаётся всего несколько решений.
    1) WebSocket
    2) Server Sent Events
    3) Comet

    Однако. Все эти решения требуют глубокой переработки вашего приложения, и просто добавить кусочек кода в имеющийся цикл не получится.
    Ответ написан
  • Как объединить 2 строки в одну?

    @MadridianFox
    Web-программист, многостаночник
    Если вы хотите возвращать из функции несколько значений, используйте массив.
    function banana(){
        $first = "first";
        $second = "second";
        return [$first, $second];
    }

    Для получения такого результата удобно использовать функцию list
    list($first, $second) = banana();
    echo $first;
    echo $second;
    Ответ написан
  • AJAX + PHP постепенный вывод результатов?

    @MadridianFox
    Web-программист, многостаночник
    Скорее не первый $info, а последний, т.к. вы в цикле перезаписываете переменную.
    Возможно вы хотели написать
    public function start ($message) {
        $info=[];
        foreach ($user as $user){ 
            $status = $op->post($message,$user,$us);
            if($status == false){ 
                $info[] = "error"; 
            }else{
                $info[] = "ok";
            }
        }
        return $info;    
    }
    Ответ написан
    4 комментария
  • Как передать значение Label в обработчик формы?

    @MadridianFox
    Web-программист, многостаночник
    Делайте скрытое поле, которое будет содержать текст из label.
    Ответ написан
    2 комментария
  • Подход к реализации DI в проектах Yii2 - правильно или не очень?

    @MadridianFox
    Web-программист, многостаночник
    Какое-то однобокое решение:
    if (!isset($config['dependencyClass'])) {
        $this->dependencyClass = new Dependency();
    }

    Вроде как и внедрение зависимости, но всё-равно остаётся жесткая связь.

    А чем вас не устроил родной Yii сервис-локатор через конфиг?
    Можно было бы делать конфигурирование зависимости как компонента yii вот так:
    //config/web.php
    "components"=>[
        //...
        "model_deps"=>[
              "class"=>"app\components\ModelDependenciesService",
              "default_dependency"=>"app\model\model_2",
              "dependencies"=>[
                     "app\model\model_1"=>[
                            "dep_1"=>"app\model\model_3",
                            //....
                      ]
               ]
         ]
        //...
    ]
    // в базовом классе модели
    public function getDepClass($dep_name){
        retrn Yii::$app->model_deps->depClass(static,$dep_name); // не помню точно как текущий класс брать
    }
    // где-то в модели
    public function getDependencies()
    {
        return $this->hasMany($this->getDepClass($dep_name), ['modelId' => 'id']);
    }

    В классе ModelDependenciesService, естественно надо реализовать метод depClass, который будет возвращать класс зависимости или класс по умолчанию, если зависимость не определена.
    Ответ написан
    Комментировать
  • Есть ли способы удобно обработать несколько десятков вариантов формирования sql запроса?

    @MadridianFox
    Web-программист, многостаночник
    В простейшем случае сформировать условие из набора параметров можно вот так:
    $params = [
        'param1'=>'value 1',
        'param2'=>'value 2'
    ];
    $where_str="";
    if(!empty($params)){
        $where = [];
        foreach($params as $param=>$value){
            $where[]="$param = '$value'";
        }
        $where_str = " WHERE ".join(" AND ", $where);
    }
    $sql = "select * from table".$where_str;

    Этот код довольно условный - тут нет защиты от sql инъекций, он не привязан к расширению для работы с БД. Но в целом так работает большинство генераторов запросов.
    Ответ написан
    Комментировать
  • Как правильно распарсить строку?

    @MadridianFox
    Web-программист, многостаночник
    Разбиваем правило по слешу, проходимся по полученному массиву и строим регулярку.
    Если элемент массива начинается с двоеточия - добавляем в регулярку ([a-zA-Z]+), иначе добавляем сам элемент. Ктати, надо запоминать что :app - в нулевой позиции, а :action - в первой.
    В итоге получаем /\/emergency\/([a-zA-Z]+)\/([a-zA-Z]+)/. Если строка проходит поиск по этой регулярке - то мы нашли что искали. Остаётся только взять найденные регуляркой значения и передать их в контроллер, не забыв присвоить им имена - не зря же мы запоминали в какой позиции стоят плейсхолдеры.
    Ответ написан
  • Что не так с запросом?

    @MadridianFox
    Web-программист, многостаночник
    Если вы создаёте кучу одинаковых таблиц с разными названиями - то у вас проблемы не с запросом как таковым, а с подходом к работе с БД.
    Что мешает создать одну таблицу, в которой дополнительно будет поле user?
    Ну и подобным образом вставлять данные в запрос тоже нехорошо. Любой пользователь может послать в POST вместо названия таблицы кусок sql кода, который либо удалит всю базу, либо позволит увидеть конфиденциальные данные.
    Ответ написан
    Комментировать
  • Как сделать на сайте поиск по товарам с учетом геолокации?

    @MadridianFox
    Web-программист, многостаночник
    В некоторых СУБД есть функция для расчёта расстояния на сфере по координатам.
    Соответственно необходимо для каждого города продавца знать координаты - широту и долготу, а так же определять координаты пользователя.
    Запрос в таком случае будет выглядеть примерно так:
    select * from table where geo_length(table.x, table.y, '<x пользователя>', 'y пользователя') < 100

    Название функции зависит от СУБД.
    Ответ написан
    Комментировать
  • Как автоматически сформировать путь?

    @MadridianFox
    Web-программист, многостаночник
    А нужен ли пользователю путь в адресной строке?
    Значения по умолчанию в Yii2 реализуются очень просто
    public function actionIndex($id="mainpage", $user=1){
        // ...
    }
    Ответ написан
    4 комментария
  • Как перевести нумерованный массив в ассоциативный?

    @MadridianFox
    Web-программист, многостаночник
    Как уже сказал Роман, в php массивы изначально являются ассоциативными и по сути являются хеш-таблицами.
    Таким образом массив без ключей, на самом деле является ассоциативным массивом, где в качестве ключей используются числа.
    Ответ написан
    Комментировать
  • Как составить PHP7 Dockerfile с intl и ICU версии 55.1?

    @MadridianFox
    Web-программист, многостаночник
    Необходимо найти репозиторий для используемого дистрибутива с нужной версией ПО, и прописать его в /etc/apt/sources.list
    Ну и в дальнейшем устанавливать необходимый пакет с указанием версии.
    Ответ написан
  • Почему не работает мой selenium script на facebook?

    @MadridianFox
    Web-программист, многостаночник
    Может просто фейсбук не хочет чтобы по нему боты лазили. Причём такие наглые)
    Ответ написан
    Комментировать
  • Не получается удалить записи из таблицы!?

    @MadridianFox
    Web-программист, многостаночник
    Нужно сначала удалять связи комментариев и категорий а только потом удалять саму категорию.
    Иначе получается что вы удалили категорию, а в другой таблице остался её id. СУБД этого не допускает и выдаёт ошибку.
    Ответ написан
    5 комментариев
  • В чем разница между namespace и use? И как они связаны с файловой системой?

    @MadridianFox
    Web-программист, многостаночник
    На уровне языка пространства имён с файловой системой никак не связаны.
    Пространства имён - лишь способ решить конфликты имён классов.
    Вот ты говоришь - у меня есть класс ClassName, но к сожалению, такой класс уже есть в одной из библиотек, которые ты используешь. Можно было бы назвать класс MyClassName, ну и везде добавлять приставку My. Редко, но бывает что надо сделать два класса с одинаковым именем в одном проекте. Тогда ты называешь один класс MyBananaSybsystemClassName, а другой MyAnanasSubsystemClassName - тем самым обозначая разницу в названии.
    И даже это не спасёт от простого совпадения.

    И тут на помощь приходят пространства имён.
    В начале файла в котором лежат классы (лучше один класс в одном файле) пишется название пространсва имён, вот так:
    namespace banana;
    И теперь все классы, объявленные в этом пространстве имён имеют название banana\ClassName, хотя внутри этого файлв ты можешь по прежнему обращаться к ним просто по ClassName.
    В другом файле надо использовать полное название, вроде как:
    $obj = new banana\ClassName();
    но, если надо много раз писать название класса можно сделать вот так:
    use banana\ClassName;
    $obj = new ClassName();

    , но самое полезное здесь это разрешение конфликтов. Если вдруг в другом месте определён такой же ClassName, то можно просто переименовать его:
    use banana\ClassName;
    use ananas\ClassName as AnanasClass;
    $obj1 = new ClassName();
    $obj2 = new AnanasClass();


    Вот это и есть суть пространства имён. Таковы они во всех языках программирования в которых они есть.
    Но есть от них ещё одна польза - можно настроить автоматическое подключение unclude(); файла с классом.
    Делается это с помощью определения функции автозагрузки
    function __autoload($classname){
    // как-то по имени класса находим файл и подключаем
    }
    // или, лучше
    spl_autoload_register(function ($classname) {
       // как-то по имени класса находим файл и подключаем
    });


    Каждый раз, когда ты обращаешься к классу и php не может его найти в подключенных файлах - запускается код написанный в функции автозагрузки. В эту функцию передаётся название класса.
    При чём же тут пространства имён? А при том, что в функцию автозагрузки передаётся полное имя класса с пространтсвом имён.
    Это значит что ты можешь делать по одному файлу на класс, класть их в папки, а в пространство имён в каждом файле писать путь до этого файла.
    После этого пишешь функцию, которая просто заменяет в названии класса слеши на те, что поддерживаются операционной системой как разделители пути, и просто подключаешь файл.
    Именно об этом и написано в каком-то там PSR
    Ответ написан
    2 комментария
  • Как сортировать ключи массива php по алфавиту и длине?

    @MadridianFox
    Web-программист, многостаночник
    Не изобретайте велосипед.
    Возьмите какую-нибудь реализацию стемминга на php и сделайте вот такую матрицу:
    $words = [
        "слово"=>["кол-во вхождений", "корень", "длинна слова"],
        ...
    ];

    где "корень" - это результат работы стемминг-функции над словом. Такие слова как Бык и Быки будут преобразованы к слову Бык.
    Далее эту матрицу сортируем во всем столбцам в том порядке в котором они указаны - по вхождениям, по корню, по длине. Таким образом, одинаково встречающиеся слова отсортированные по корню будут в алфавитном порядке, но когда корни одинаковые - будет играть роль их длинна.
    Ответ написан
    Комментировать
  • Как через xpath добраться до середины текста на php?

    @MadridianFox
    Web-программист, многостаночник
    XPath - способ добраться до элемента, но не редактирования DOM.
    Ответ написан
    Комментировать
  • "Сильные" книги по Symfony и архитектуре приложений?

    @MadridianFox
    Web-программист, многостаночник
    Мартин Фаулер - Шаблоны корпоративных приложений. Это как раз вторая ссылка что Вы сами указали. Эта книга не может быть старовата, т.к. поясняет общие принципы, которые применяются во всех фреймворках.
    Более того. Всякие Symfony-специфичные книги могут быть староваты, но не Фаулер.
    Ответ написан
    Комментировать
  • Как сменить версию php на xampp в ubuntu?

    @MadridianFox
    Web-программист, многостаночник
    Проблема всяких *AMP сборок в том что человек привыкает не "держать в руках" конфигурацию. Ну и ещё некоторые сборки грешат тем, что изменяют расположение конфигурационных файлов.
    Сейчас Вы вроде уже нашли решение, но в целом надо взять, потратить день и научиться всё ставить самостоятельно, тогда и проблемы смены версии не будет.
    В идеале надо потратить ещё день, и научиться работать с docker, т.к. проектов много, а ОСь одна, и постоянно менять на ней версии ПО не очень удобно.
    Ответ написан
    Комментировать
  • Как сконвертировать в utf 8 большой текстовый файл?

    @MadridianFox
    Web-программист, многостаночник
    Сомневаюсь что есть способ конвертировать файл в одну кодировку, когда разные его части имеют разную кодировку.
    И вообще, зачем понадобилось складывать всё в один файл?
    Не легче ли было записывать полученные данные в базу, ато файл на 40Гб...
    Ответ написан
    Комментировать