Хобрук: Ваш путь к мастерству в программировании

Отлов ошибок Mysqli

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

Это нормально? Есть ли настройка PHP, которую я должен проверить, чтобы исправить это, чтобы любые ошибки запроса mysqli вызывали исключения?

(Я не хочу, чтобы возникало исключение, если запрос возвращает 0 результатов - только если он выдает ошибку из-за опечатки или другой ошибки в структуре запроса)

Пример запроса:

if($result=$db->query('SELECT bad_field_reference FROM table')){while($r=$result->fetch_assoc()){$data[]=$r;}}$result->free();

Если я попытаюсь выполнить этот запрос в PHPMyAdmin, он скажет мне, что столбец bad_field_reference не существует. Если я попытаюсь выполнить его как часть моего PHP-скрипта, вся страница перестанет загружаться в этот момент.

Чтобы уточнить, я просто проводил тестирование, просматривая исходный код страницы. По-видимому, остальная часть страницы загружается, однако, когда java включена, некоторые элементы скрыты, тогда я использую jquery для повторного отображения некоторого содержимого в анимированном виде. Эти сценарии jquery не выполняются, поэтому страница перестала загружаться.

Итак, теперь 2 вопроса: как мне заставить PHP «поймать» ошибку и как заставить jquery по-прежнему запускать свои сценарии?


  • если неудачный запрос mysqli приводит к остановке всего вашего скрипта, и ваш обработчик ошибок не завершает работу, более чем вероятно, что ваш обработчик ошибок сам выдает ошибку. 05.10.2013
  • Он работает для каждой другой возникающей ошибки/исключения, но только не в том случае, если в самом запросе есть ошибка. 05.10.2013
  • покажите код, который вы используете для своего запроса 05.10.2013
  • Запросы разные. Добавил пример выше. 05.10.2013
  • какие-либо ошибки в журнале ошибок вашего сервера? 05.10.2013
  • Нет никаких ошибок, о которых сообщает пользовательский обработчик ошибок или обработчик исключений. Я также проверил журнал ошибок сервера - там тоже не вижу связанных ошибок. 05.10.2013

Ответы:


1

Это нормально?

No.

Есть ли настройка PHP, которую я должен проверить, чтобы исправить это, чтобы любые ошибки запроса mysqli вызывали исключения?

да.

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

Однако не все функции mysqli_* будут вызывать ошибку БД, некоторые из них вызывают обычные ошибки PHP, например free(), и эта часть заставляет меня задуматься еще больше: мне также чрезвычайно любопытно, почему вы обрабатываете только исключения, но оставляете PHP ошибки необработанные. Не говори мне, что ты have error_reporting(0); - не так ли? Если так - у меня нет слов.

Наконец, у меня есть подозрение, что у вас есть сырой mysqli->query(), разбросанный по всему коду. Что значит

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

Вы должны использовать библиотеку абстракций, которая поместит весь повторяющийся код в методы класса. Посмотрите, как выполняется ваш запрос с помощью safeMysql:

$data = $db->getAll('SELECT bad_field_reference FROM table');

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

05.10.2013
  • Есть и обработчик исключений, и обработчик ошибок. Ни один из них не срабатывает прямо сейчас, если в запросе есть ошибка. Для отчетов об ошибках установлено значение 2048 — строгое. Под заполнителями вы имеете в виду подготовленные заявления? Я использую их для всех вставок/обновлений, но редко для запросов на выборку, поскольку единственными входными данными являются целочисленные значения, которые я могу легко дезинфицировать. 05.10.2013
  • Это одно из серьезных заблуждений. Ваш сайт открыт для инъекционных атак 05.10.2013
  • Говоря об обработчике ошибок - почему у вас не было сообщения об ошибке от вызова free(), говорящего вам, что что-то требует объекта оператора mysqli, но задано логическое значение? 05.10.2013
  • Я не уверен, почему мне не выдавали ошибку на free(). Если единственными входными данными являются целые числа, которые очищаются с помощью intval(), где может возникнуть риск внедрения? 05.10.2013
  • 1. Ввод никогда не ограничивается только одним типом. 2. SQL-инъекция не имеет ничего общего с вводом. 3. Сейчас XXI, а я ловлю себя на том, что объясняю необходимость подготовленных утверждений... 05.10.2013
  • По какой-то причине, если я установил mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); страница блокируется, но если я просто установлю mysqli_report(MYSQLI_REPORT_ERROR); он работает и генерирует ошибку правильно. 05.10.2013
  • Ошибка, а не исключение. И это снова запирает. У вас что-то не так с обработкой ошибок. Убедитесь, что у вас есть E_ALL в php.ini и зарегистрированы ошибки 05.10.2013

  • 2

    Я нашел решение для части «запирания». В моем примере кода у меня есть следующий формат:

    if(--query--){--сделай что-нибудь--}бесплатный результат.

    Это прекрасно работает, когда запрос синтаксически правильный. Однако, если запрос завершается ошибкой, нет результата для освобождения. Это то, что было ошибкой и заставляло страницу выглядеть так, как будто она не загружалась. Как только я переместил «бесплатный результат» в скобки, например

    if(--query--){--сделай что-нибудь-- бесплатный результат}

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

    if($db->error){handle error}
    
    05.10.2013
    Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

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

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

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

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

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..