Ответы пользователя по тегу PHP
  • Почему Monolog не может записать файл?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    В сообщениях об ошибке всё написано.
    Монолог ругался, что у него не хватает прав на запись. И правильно ругался, потому что писать логи приложения в /var/log - это очень так себе идея.

    А сама эта аминязданпапанах ничего не ругается, потому что её автор - дебил.
    Вот за такое
    if (false === @file_put_contents($path, $content)) {

    хочется очень долго бить по пальцам чем-нибудь тяжелым.
    чтобы никогда больше в голове даже мысль не возникала писать такой высокоинтеллектуальный код.
    который, как раз и занимается тем, что скрывает реальную причину ошибки
    Которая, скорее всего, опять "нет прав". Только уже не для логов, а для собственно создаваемого файла.
    Ответ написан
    1 комментарий
  • Как использовать ReactJS + PHP?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Правильно.
    Только чтобы общаться с РНР по API, надо сначала написать на РНР этот API
    Ответ написан
    Комментировать
  • Как на стороне сервера закрыть соединение с кодом 200?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Сначала http_response_code, а потом echo.
    Азы протокола НТТР. Заголовки идут перед телом ответа.

    Впрочем, это может быть и любая другая ошибка. К примеру, никакого класса EventHttpRequest нет и в помине.
    Чтобы не получать "совсем другой ответ", ошибки надо логировать, читать и исправлять.

    Стандартная функция, которая закрывает соединение - fastcgi_finish_request()
    Ответ написан
    7 комментариев
  • Как лучше реализовать корзину для магазина?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    На все эти вопросы легко ответить самостоятельно, если просто немного подумать.
    Никакое знание РНР тут не требуется - только здравый смысл и минимальное понимание принципа работы веб-сайта.

    Обычно для анрегов корзина делается в сессии, а для регов - в базе.
    При логине и наличии корзины в сессии, содержимое мержится с корзиной в базе. То есть такого вопроса "как сделать идентификацию" в принципе не возникает - все делается само собой. Когда юзер авторизовался, у нас есть и его ид, и сессиия. Что тут может быть не ясно?
    Ответ написан
    Комментировать
  • "Умение профилировать и отлаживать свой код без использования функции dd/var_dump" - это как?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это называется словом "трассировка".
    Пошаговое выполнение программы средствами IDE, с контролем значений всех переменных.
    На определенной строке программы ставится специальная метка, брекпойнт.
    Дойдя до неё, интерпретация кода остановится, и дальше можно будет выполнять каждую строчку по одной, видя при этом значения всех переменных. Причем именно всех, а не только тех, которые ты добавил в дд.
    То есть трассировка средствами IDE удобнее, быстрее и даёт больше информации, чем ручное колупание с вардамп.

    В РНР этим занимается xdebug в связке с IDE

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    На мелких одноразовых задачах вида "сделать форму, которая бы сохраняла что-то в таблицу и забыть про нее" понять преимущества MVC невозможно.

    MVC - это не про сделать, а про поддерживать и развивать.

    Представим, что вместо обычной формы мы решим сделать ajax. Если у нас будет обычный винегрет из SQL, PHP и html, то придется переписывать его весь.
    Если же у нас нормальная структура, то просто заменим во View вызов шаблонизатора на json кодирование. то есть поменяем одну строчку кода.

    Допустим, в дополнение к форме нам нужно будет сделать консольную команду, которая берет данные из файла.

    Если используется обычный говнокод-подход, то придется все писать заново.
    При использовании MVC, надо будет в этой утилите написать только чтение из файла, а дальше просто вызвать метод модели, который у нас уже есть.
    Ответ написан
    Комментировать
  • Как разделить данные при join-е ( pdo:mysql )?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Без вариантов.

    При ближайшем рассмотрении создание объектов прямо из пдо оказывается довольно бесполезной фичей.

    По данному вопросу либо цикл, как например здесь, либо просто два запроса, второй по списку id из первого
    Ответ написан
    Комментировать
  • Почему не выполняется условие в JavaScript?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Не понимаю, что сложного в том, чтобы зайти в документацию. И увидеть там
    dataType
    Type: String
    The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html).

    То есть мало того что у нас древнее и никому не нужное жквери, так оно ещё и играет в угадайку.

    Вместо которой надо явно написать, в каком формате мы данные ожидаем.

    Плюс из пхп лучше не плеваться непонятными словами, а отправлять в нормальном формате, например json.

    Ну и PHP код - это конечно, ужас.
    Ответ написан
    Комментировать
  • Конфигурация проекта: где и как лучше хранить?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Самый простой, надёжный и удобный способ хранить настройки - это пхп файл.

    Как правильно было выше замечено, многие форматы не поддерживают никакие типы кроме строк. Кроме того, любая иде сразу подхватит все настройки в автокомплит, без лишних плагинов и плясок с бубном.

    Отличие будет только в заведении в гит. Постоянные настройки заводим, зависящие от окружения - нет. Чтобы не потеряться, в последнем случае в гит кладём пустышку, чтобы понимать, какие настройки вообще заполняем

    return [
          'db' => [
              'host' => '127.0.0.1',
              'username' => '',
              'password' => '',
              'dbname' => '',
              'port' => 3306,
          ],
      ];


    И в коде что-то вроде такого
    if (!file_exists('config.php'))
      {
          throw new \Exception('Create config.php based on config.sample.php');
      }
      $config = require 'config.php';


    Если говорить про .env, и не обращать внимание на вышеуказанные недостатки, то у него есть одно достоинство - множество способов задания переменных. В конфиге веб-сервера, в конфиге юзера, вручную, через файл, и.т.д.
    Ответ написан
    Комментировать
  • Как писать условие if если очень много значений для проверки, а нужно чтобы они за экран не залезали, не превращались в очень длинную строку?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это очень хороший вопрос!

    Для длинных условий можно и нужно использовать такую замечательную практику, как именованные условия!
    В большинстве случаев, когда условия не зависят друг от друга, можно просто присвоить результат вычисления условия переменной с обязательно говорящим именем, и дальше уже использовать эти переменные:

    $dateIsValid = $obj->getDate() >= getCurrentDate();
    $balanceOk = $obj->getBalance() > 0;
    // Любые другие условия
    if ($dateIsValid && $balanceOK) ...


    Это повышает читабельность не только сокращая само тело условного оператора, но в первую очередь превращая его в связный текст!

    Если же условия зависят друг от друга, то можно оформлять их в виде функций (методов). И тогда они не будут выполнены, если до них не дойдет очередь.
    Ответ написан
  • Что не так с функцией?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Настал момент познакомиться с такими понятиями, как отладка и безопасное выполнение SQL запросов.

    Программисты не задают посторонним вопрос, "почему мой код не работает".
    Они задают его своему коду.

    Вы уже начали отлаживать свой код, выводя промежуточные результаты. Это очень хорошо. Но почему-то тут же остановились

    Ну если запрос не находит записей - разве не логично вывести его на экран и посмотреть, что с ним не так.

    А после того, разберётесь с запросом, надо будет его переписать на подготовленные выражения. Потому что вот это вот - это какой-то позор
    Ответ написан
    Комментировать
  • Интерфейсы в связке с абстрактными классами?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Смысл простой.
    Интерфейс - это публичный контракт. То, как класс виден внешнему миру.

    Абстрактный класс - это прототип внутренней реализации, то, как он устроен внутри.

    Так что дополнять можно и нужно.
    Ответ написан
    Комментировать
  • Почему не видит файлы, если они не находятся в одной папке с index.php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если путь к файлам верный, то всё работает
    Ответ написан
    Комментировать
  • Как правильно ставить куки для авторизации?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Как всегда, здесь подводит логика.
    Если в базе есть что красть, то при "угоне базы" возможность авторизоваться будет самой меньшей из проблем.
    Если в базе кроме логина и взять нечего, то и возможность авторизоваться не поможет. Ну угнал ты скажем аккаунт пользователя интернет-магазина - и какой с этого навар?

    Не говоря уже о том, что "угнать базу" не так легко как кажется. Если это в принципе возможно, то значит проект в принципе ламерский, и в нём и других дыр выше крыши - то есть авторизоваться можно будет скажем через XSS или SQLi

    Во всех нормальных системах никто такими нелепыми страхами не страдает и нормально хэши хранятся в базе, что дает возможность контроля авторизации, в том числе на выбранных устройствах.

    Если же нет уверенности в собственных силах, что удастся защитить базу от слива, то можно использовать JWT токены.
    Ответ написан
    Комментировать
  • Тернарный оператор, ?? вместо ?:, зачем?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Надо включить информирование об ошибках.
    Тогда сразу станет видно, что код работает не точно так же
    Ответ написан
    Комментировать
  • Как совместить elasticsearch и php 7.0?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    > хочется понять насколько сложно сделать апдейт на 3 версии.

    Несложно. Отличия минимальны. В рамках одной мажорной версии вообще никаких проблем. Тут вопрос даже не в трудностях, а в том, что оставаться на 7.0 это вообще не вариант.
    Только переезжать надо на 7.4, потому что поддержка 7.3 прекращается через месяц.

    И вообще, версию надо подтягивать не когда жареный петух в зад клюнет, а планово.
    Ответ написан
    1 комментарий
  • Нужно ли два раза прописывать session_start()?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Не "два", а в каждом скрипте, который использует сессии.
    поэтому обычно её просто кладут в общий файл, который инклюдится во все скрипты

    Ошибка headers already sent к количеству вызовов отношения не имеет, это стандартная ошибка при кривой структуре кода и лечится элементарно. В интернете примерно миллион рекомендаций по её решению.
    Ответ написан
  • Как правильно получить массивы из формы в POST и отправить?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    foreach ($_POST as $key => $value) {
        echo "$key=". (is_array($value) ? implode(",", $value) :  $value)."<br />\n";
      }
    Ответ написан
    2 комментария
  • Apache не открывает страницы .php а отображает их списком файлов, как исправить?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
  • Стоит ли проверять имя и пароль пользователей при каждом запросе к api(guzzle)?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Стоит ли проверять имя и пароль пользователей при каждом запросе к api(guzzle)?

    Вот как всегда, в заголовке вопроса одно, а в тексте - ну совсем же другое.

    В моем случае выдавать токен вообще бессмысленно,верно?

    Верно

    Но в общем случае, на который претендует вопрос судя по заголовку, проверять каждый раз не стоит, а стоит выдавать по логину и паролю ограниченный по времени токен при запросе на отдельную точку входа.
    Ответ написан