• Почему Monolog не может записать файл?

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

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

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

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    GROUP_CONCAT()
    Но это редко бывает полезно поскольку обычно нужны не только названия ролей, но и их идентификаторы
    Если хочется "одной строчкой", то надо осваивать продвинутые ORM типа Doctrine
    Ответ написан
    Комментировать
  • Как использовать 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 комментария
  • Как правильно организовать получение списка данных с дополнительным полем - количество?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Без дополнительного запроса нельзя.
    Есть разные ухищрения, которые позволят замаскировать дополнительный запрос, но по факту это будет именно он.
    Но при этом есть риск натупить с производительностью.
    Так что лучше не пытаться усидеть на двух стульях одной, ээээ..., туловищем, а сделать два отдельных запроса.
    Да, это неудобно. Но неправильный подсчет полного количества строк на большой таблице может создать очень сильную нагрузку, вплоть до того, чтобы полностью положить систему. Так что лучше не экспериментировать
    Ответ написан
    Комментировать
  • Как сравнить две строки из одной и той-же таблице без дополнительного join или from?

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

    Надо не бояться "джойнить огромную таблицу" а учиться оптимизировать запросы.
    В данном случае никакой проблемы с джойном нет .
    Если будет тормозить, поставить нужный индекс, как минимум по statusId
    Ответ написан
    Комментировать
  • Как перебрать все значения строки разделенные запятой в mysql?

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

    И тогда вопроса как прочитать значение никогда не возникнет
    Ответ написан
    4 комментария
  • Сколько времени должен занимать такой запрос MySQL?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Я не очень понимаю во всех этих AWS, но расход памяти в три гига - это какая-то чушь.

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

    Вообще цифры странные. Полное ощущение что индекс не влезает в память и идёт постоянная работа с диском. Но тогда должен процессор зашкаливать. А он на 5 процентах. Вот не понимаю я эти ваши авс.
    Ответ написан
  • Что такое MVC и как его использовать?

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

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

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

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

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

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

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

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

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

    "Я там что-то сделал, получилось каля-маля. Колеса в разный цвет красил. Не помогает".

    Буквальный ответ на вопрос из заголовка: потому что кодировка данных не совпадает с той, которую ждёт база.
    Ответ написан
    Комментировать
  • Почему не выполняется условие в 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 токены.
    Ответ написан
    Комментировать