Задать вопрос
  • Нужно ли проверять каждое обращение к БД на php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Очень хороший вопрос.
    Он вызван одной из родовых болезней РНР, в котором по какой-то причине именно операции с базой данных традиционно проверяются на каждый чих. При этом на все остальные операции почему-то никто не обращает внимания.

    Большинство складывателей букв на РНР об этом не задумываются вообще, и очень хорошо что тебе пришел в голову этот вопрос. А ответ на него очень простой:

    Проверять обращения к БД не нужно вообще

    (за исключением нескольких специальных случаев, когда есть определенный сецнарий обработки ошибки)
    Если же такого сценария нет, то никак проверять не нужно. Просто потому, что обращения к БД ничем не отличаются от любого другого кода.
    И поскольку ты не проверяешь каждый include или там оператор деления, то не нужно и проверять запросы к БД. Их надо оставить в покое. И первый, и каждый по отдельности, и все 5 разом.

    А вот что нужно сделать - это договориться с РНР, чтобы он сам сообщал тебе об ошибках в запросах. Для mysqli надо написать перед коннектом
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    Для ПДО при соединении выставить в настройках соединения

    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

    Всё. Больше ничего для обращений к БД делать не надо.

    А вот обработчик ошибок, общий для всего кода, а не только для работы с БД, настроить желательно.
    Чтобы AJAX-скрипт подписки получал соответствующий НТТР статус при любой ошибке, которая может возникнуть на сервере.
    Ну и разумеется AJAX-скрипт подписки должен проверять НТТР статус, и обрабатывать ответ только если статус= 200
    Пример обработчика можно посмотреть здесь

    Если же надо убедиться, что все пять запросов выполнились без ошибок, то для таких целей служат транзакции.
    Суть транзакции именно в том, что либо выполнияются либо все запросы, либо ни одного.
    Если заключить все 5* запросов в транзакцию, то если при выполнении одного из них произойдет ошибка, то изменения, сделанные остальными, автоматически откатятся!

    *На самом деле в транзакцию имеет смысл заключать только запросы, изменяющие данные. То есть все, кроме первого.

    Соотсветственно, если ПДО настроен на выброс исключений, то при ошибке запроса
    - пдо выбросит ислючение
    - которое будет поймано обработчиком ошибок
    - который выведет код ошибки и завершит работу РНР скрипта
    - при завершении скрипта РНР закроет соединение с БД
    - БД при закрытии соединения автоматически откатит незавершенную транзакцию

    причем без обработчика ошибок будет всё то же самое, только клиенту уйдет код не 500 а 200

    то есть для того чтобы убедиться в том что все запросы выполнились корректно, надо

    1. выставить для ПДО режим исключений
    2. перед первым запросом написать $pdo->begin();
    3. после последнего запроса написать $pdo->commit();
    Ответ написан
    4 комментария
  • А вы правда умеете программировать?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Очень показательный вопрос.
    И очень, очень, очень показательные ответы.
    Наглядно показывают то, как обыватель представляет себе программирование:
    назапоминать побольше "функций", в продвинутом варианте - записывать на бумажку, и совсем уровень бога - уметь пользоваться гуглем. Для поиска этих самых функций.

    Слово "алгоритм" ни в вопросе, ни в многочисленных ответах не встретилось ни разу.

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

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

    Вообще, я тут подумал что разница между программистом и таким вот "рисовальщиком" (как мне правильно попеняли в комментах, я обижаю своим сравнением настоящих ухдожников) очень простая - рисовальщик боится не запомнить все функции, а программист пишет свою. Как только ты написал свою первую функцию, чтобы избежать рутинного повторения в стандартной операции - ты сделал первый шаг к тому, чтобы стать программистом. И опа - ты уже можешь забыть десяток стандартных функций, посольку у тебя уже только одна, которая выполняет работу тех десяти. собственно, работа программиста и стстоит, в каком-то смысле, в том, чтобы не использовать (и - соответственно - не запоминать) стандартные функции. У него есть библиотека своих функций
    Ответ написан
    5 комментариев
  • Не понимаю паттерн MVC. Что почитать/посмотреть?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Как всегда, набежало "специалистов"-попугаев, повторяющих заученные фразы, но так и не понявших ни что такое сам паттерн, ни вопроса, который был задан.

    Хотя ответ очень простой и первый вопрос автора даёт очень простую подсказку.

    Вся суть эмвэцэ в том, что это всего лишь интерфейс. Штепсель. Розетка, через которую твое приложение подключается к веб. Веб-интерфейс твоего приложения.

    То есть к самому приложению, если подумать, отношения не имеет.

    И из понимания этого простого факта становится ясно, зачем нужен контроллер - в нем и происходит это самое соединение. Веб запросы транслируются в обращения к модели. А ответ модели - в красивые веб странички, в чем помогает Вью

    При этом модель - это не убогий интерфейс к таблице в бд, как думают все попугаи. А собственно все приложение и есть. Это ещё называется бизнес-логикой.

    Из всего этого становится очевидно, что этот загадочный паттерн в сущности составляет мизерную долю кода. И понимание эмвэцэ никак не поможет написать само приложение. он вообще не про это. Понимание поможет только меньше накосячить, перемешав веб-интерфейс и бизнес-логику.

    Ответ с картинками и видео с ютюбе https://qna.habr.com/answer?answer_id=1475989#answ...
    Ответ написан
    1 комментарий
  • На youtub есть канал где читают код PHP?

    hack504
    @hack504
    Изучаю PHP рекомендуют читать чужой код.

    Даже спецы не читают чужой код, если их не заставят. Но было бы прикольно, действительно, посмотреть на youtub как разрабы читают чужой код, особенно на PHP
    1387209829_1176468776.gif
    Ответ написан
    10 комментариев
  • Почему каналы в go так странно работают?

    Все просто.
    1. Если канал без буфера, то при чтении из него программа заблокируется на этом месте, пока кто-то в другой горутине не запишет в этот канал значение. Соответственно, операция записи тоже заблокируется до тех пор, пока кто-то не захочет прочитать из канала.
    2. Если канал с буфером и в буфере еще осталось место, то операция записи не заблокируется, а сразу вернет управление. Операция чтения тоже не заблокируется, если в буфере есть какие-то данные. Если же буфер полный, то запись будет вести себя так же как в п1. Если буфер пустой, то чтение будет вести себя так же как в п1.

    В вашей программе внутри createChan создается канал и сразу же делается в него запись. Эта запись блокируется в ожидании того, что кто-то прочитает из канала. Но чтение из канала у вас произойдет только при выходе из функции, поэтому программа останавливается навечно.
    Ответ написан
    Комментировать
  • Возможно ли такое на mysql?

    @I_Pavlov
    Разработчик
    select *
    from `user` `u`
    join `property` `p`
    left join `user_property` `up` on `up`.`user_id` = `u`.`id` and `up`.`property_id`=`p`.`id`
    where `up`.`id` IS NULL
    Ответ написан
    1 комментарий
  • На чем зарабатывает Quora, toster или подобные сайты?

    shmatuan
    @shmatuan
    8 year of Web, 5 years of Vue
    Можно просто выключить адблок и увидеть ответ
    5bd0447166cd2277435374.png
    Ответ написан
    Комментировать