Задать вопрос
  • Возможно ли сымитировать загрузку файла на сервер, если операция проходит на локальном ПК и установленном на нем Openserver?

    @MadridianFox
    Web-программист, многостаночник
    У вас в запросе на добавление данных в БД используется переменная $screenshot, но нигде выше (в предьявленном куске кода) она не определяется.
    Вам необходимо получить из супеглобального массива $_FILES данные о загруженном файле, там будут название, размер и путь до временного файла. Обычно, при загрузке файлов берут временный файл и копируют туда где он будет лежать, а путь до этого самого "туда" записывают в базу.
    Загружать файл можно даже "на локальном ПК и установленном на нем Openserver".
    Ответ написан
    Комментировать
  • На чём следует писать высоконагруженное API - на "PHP" или "Node.JS"?

    @MadridianFox
    Web-программист, многостаночник
    Высоконагруженный, да и вообще любой серьёзный проект, надо писать не "на чём?", а "как?". Точнее надо писать код так, чтобы он поддерживал горизонтальное масштабирование.
    Это значит что ваш код должен уметь запускаться на нескольких серверах сразу и не так чтобы отдельные части в разных местах, а именно дублироваться. "Перед" копиями должен стоять балансировщик, который на основании того, насколько загружен тот или иной сервер, выбирает на какой сервер адресовать приходящий запрос.
    Тут же стоит продумать бутылочные горлышки, а точнее избавиться от них. Например БД, она может поддерживать запуск своих копий на разных серверах, а может и не поддерживать.
    Сессии пользователей можно хранить централизованно, а можно делать "липкую" сессию, когда все запросы одного пользователя будут всегда идти на один сервер.
    В итоге, highload - это не про то на чём пишется софт, а про то как он пишется.
    Ответ написан
    Комментировать
  • Как загрузить классы без composer?

    @MadridianFox
    Web-программист, многостаночник
    spl_autoload_register() принимает функцию, которая принимает имя класса, который вы попытались использовать.
    Соответственно, вам нужно написать функцию, которая по имени класса делает include соответствующего файла.
    Важно - в функцию передаётся имя класса с пространством имён. Обычно люди располагают классы в пространстве имён точно так же как лежат файлы, т.е. файл в папке значит класс в одноимённом пространстве имён.
    В итоге, в файле test.php должен быть примерно такой код:
    spl_autoload_register(function($classname){
        $filename = // тут вычисляем имя файла из $classname
        include($filename);
    });
    Ответ написан
    1 комментарий
  • Как использовать функции другого файла в PHP?

    @MadridianFox
    Web-программист, многостаночник
    Если у вас нет классов, то без include никак.
    Но даже когда у вас функции являются методами классов, и настроена автозагрузка, то include тоже делается, только неявно.
    Поэтому совсем без include никак не получается.
    Ответ написан
    Комментировать
  • Почему выводит только 1 запись?

    @MadridianFox
    Web-программист, многостаночник
    mysqli_fetch_assoc возвращает одну строку результата запроса в виде ассоциативного массива.
    При следующем вызове этой функции она вернёт следующую строку результата запроса.
    В случае если в результате закончились строки, функция вернёт false;
    В итоге надо вызывать эту функцию в цикле.
    $query_result  = mysqli_query($sqlConnect, "select ...");
    while($row = mysqli_fetch_assoc($query_result)){
        //...
    }
    Ответ написан
  • В чем проблема вроде как и php настроил?

    @MadridianFox
    Web-программист, многостаночник
    Сессию стартовать надо до печати любого текста.
    Об этом и текст варнинга - headers alredy send.
    При старте сессии сервер отсылает клиенту куки с идентификатором сессии. Куки передаются в заголовках. Заголовки можно посылать только перед посылкой тела ответа. Любой echo начинает отправлять тело ответа, и заголовки уже отправлять нельзя.

    Ну а самый первый варнинг - устаревший способ обозначения конструктора. Люди, очнитесь, php 5 уже лет десять как вышел! Надо использовать __construct()
    Ответ написан
  • 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 комментариев