×
Закрытие
3
×

Дополнительные материалы бесплатно предоставляются только зарегистрированным пользователям.

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

Для тех кто не зарегистрирован, можно это сделать на вкладке Регистрация.

Статья сборника Как установить графический редактор GIMP

Перейти к статье

Устанавливаем графический редактор GIMP

  1. Выбор графического редактора
  2. Устанавливаем программу GIMP
  3. Устанавливаем Руководство пользователя

Здравствуйте уважаемый посетитель!

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

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

Кроме того здесь можно будет посмотреть, как в этот редактор добавить встроенное "Руководство пользователя", а также приведен бесплатный видеокурс, где можно поближе с ним познакомиться.

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

    Cайт на практическом примере

    Текущее состояние создаваемого сайта

    Здесь можно посмотреть текущее состояние сайта, создаваемого в рамках цикла статей Самописный сайт с нуля своими руками.

    Исходные файлы данного сайта можно скачать из прилагаемых к статьям дополнительных материалов.

    Вы здесь: Главная → Сборник статей → Обработка ошибок → Обработка ошибок sql-запросов


    Автор: / Дата:

    Обработка ошибок SQL-запросов

    Здравствуйте, уважаемый посетитель!

    Ранее мы создали механизм, предусматривающий обработку ошибок в случаях обращения к несуществующим ресурсам сайта (404 Not Found), а также при возникновении различного рода событий в PHP. В принципе, этого вполне может быть достаточно для контроля работы сайта во время формировании динамической страницы.

    Однако, для более полной оценки, совсем нелишним будет иметь возможность также обрабатывать и ошибки, относящиеся к языку структурированных запросов SQL (Structured Query Language), который используется для взаимодействия с базой данных.

    Конечно, такие случаи обычно приводят к определенным сбоям в работе PHP, сопровождающимися выводом соответствующих сообщений, что позволяет по косвенным признакам определить наличие несоответствий SQL-запросов. Тем не менее, непосредственное их выявление может существенно упростить устранение возникших в таких ситуациях проблем.

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

    Содержание


    • Формирование ошибки SQL-запроса
    • Перехват ошибок и сохранение их в лог-файле
    • Проверка механизма обработки SQL-ошибок
    • Исходные файлы сайта

    Формирование ошибки SQL-запроса


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

    Достаточно простым решением, которое мы будем использовать, это применение встроенной PHP-функции trigger_error(). С помощью которой полученная информация о возникшем несоответствии будет генерироваться в пользовательскую ошибку с назначенным уровнем важности E_USER_ERROR, E_USER_WARNING или E_USER_NOTICE.

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

    Как практически это выглядит, можно увидеть на примере функции getLineThreeColumnThreeСondition(), обеспечивающей, наряду с другими, работу сайта с базой данных MySQL. В которой вместо ранее используемой функции die() добавлена строка, обеспечивающая формирование заданной пользовательской ошибки (выделено светлым фоном).

    1. //----Универсальная функция вывода одиночной строки по трем значениям в трех полях----

    2. function getLineThreeColumnThreeСondition($table, $column_1, $value_1, $column_2, $value_2, $column_3, $value_3) {

    3. global $mysqli;

    4. if (!$result = $mysqli->query("SELECT * FROM `$table` WHERE `$column_1`='$value_1' AND `$column_2`='$value_2' AND `$column_3`='$value_3'")) {

    5. trigger_error ('При выполнении SQL-запроса возникла ошибка: код ошибки - '.$mysqli->errno.', описание - ' .$mysqli->error, E_USER_ERROR);

    6. }

    7. return $result->fetch_assoc();

    8. }

    9. ?>

    Рис.1 Функция вывода строки по заданным условиям с формированием ошибки SQL-запроса

    В этом случае, если при выполнении SQL-запроса (поз.5) возникнет какое-нибудь несоответствие, то функцией trigger_error() (поз.6) будет сформирована пользовательская ошибка с назначенным уровнем E_USER_ERROR, с указанием кода, возвращенного конструкцией $mysqli->errno, и ее описанием - $mysqli->error.

    Таким образом, выполнив аналогичные изменения во всех функциях, находящихся в файлах каталога logs, мы в случае возникновения каких-либо проблем при выполнении запроса SQL обеспечим формирование соответствующей пользовательской ошибки PHP со всей необходимой для ее идентификации информацией.

    Перехват ошибок и сохранение их в лог-файле


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

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

    Ниже показан последний вариант обработчика, в который добавлен дополнительный код, обеспечивающий обнаружение ошибки SQL и сохранение информации о ней в лог-файле (выделено светлым фоном).

    1. //----Перехват и обработка ошибок PHP----

    2. function errors_handler($errno, $errstr, $errfile, $errline){ //Пользовательская функция обработчика ошибок PHP

    3. $errors = array( //Формирования массива констант ошибок

    4. E_WARNING => 'E_WARNING',

    5. E_NOTICE => 'E_NOTICE',

    6. E_CORE_WARNING => 'E_CORE_WARNING',

    7. E_COMPILE_WARNING => 'E_COMPILE_WARNING',

    8. E_USER_ERROR => 'E_USER_ERROR',

    9. E_USER_WARNING => 'E_USER_WARNING',

    10. E_USER_NOTICE => 'E_USER_NOTICE',

    11. E_STRICT => 'E_STRICT',

    12. E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR',

    13. E_DEPRECATED => 'E_DEPRECATED',

    14. E_USER_DEPRECATED => 'E_USER_DEPRECATED'

    15. );

    16. $date = date ('Y-m-d G:i:s'); //Получение даты и времени возникновения ошибки

    17. $url = $_SERVER['REQUEST_URI']; //Получение URL страницы, при формировании которой произошла ошибка

    18. $error_message = "$date $errors[$errno] $errstr в файле $errfile в $errline строке (URL: $url)\n"; //Сформированное сообщение об ошибке

    19. if ($errno == E_USER_ERROR) { //Если обнаружена пользовательская ошибка E_USER_ERROR

    20. $current_date = date ('Y_m_d'); //Получение текущей даты

    21. $filename = 'logs/sql_'.$current_date.'.txt'; //Имя файла с директорией

    22. file_put_contents($filename, $error_message, FILE_APPEND | LOCK_EX); //Добавляем сообщение об ошибке SQL в лог-файл (в конец файла). Если файла не существует, будет создан

    23. }

    24. else {

    25. $max_message = 100; //Максимальное количество сообщений в лог-файле

    26. $filename = 'logs/warning_php.txt'; //Имя файла с директорией

    27. if (file_exists($filename)) { //Если файл существует

    28. $file_data = file($filename); //Считываем данные из файла в массив

    29. if (count($file_data) >= $max_message){ //Если количество элементов в массиве достигает максимального значения

    30. unset($file_data[0]); //Удаляем первый по списку элемент массива

    31. $clean_data = implode("", $file_data); //Преобразуем данные массива в строку

    32. file_put_contents($filename, $clean_data, LOCK_EX); //Записываем преобразованные данные с удаленным сообщением обратно в файл

    33. }

    34. }

    35. file_put_contents($filename, $error_message, FILE_APPEND | LOCK_EX); //Добавляем сообщение об ошибке в лог-файл (в конец файла). Если файла не существует, будет создан

    36. }

    37. }

    38. set_error_handler('errors_handler'); //Регистрация пользовательской функции

    39. ?>

    Рис.2 Обработчик с обнаружением и сохранением ошибок SQL

    Так, при обнаружении обработчиком ошибки E_USER_ERROR (поз.20), она будет выделена и сохранена в определенном для этого случая лог-файле (поз.23) с именем $filename (поз.21), соответствующем текущей дате $current_date (поз.22).

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

    Если ранее предусматривалось два отдельных журнала по каждому типу ошибок, в которых записи выполняются по мере их поступления, то для SQL-запросов сохранение в лог-файле будет происходить следующим образом:

    • Все записи распределяются по файлам в зависимости от даты. При этом имя файла соответствует дате его создания, например: sql_2020_03_12.txt.
    • В случае, если на момент обнаружения несоответствия в запросе, файл для текущей даты существует, то информация об этом записывается в его конец.
    • Если же файл с соответствующей датой отсутствует, то он автоматически создается вместе с соответствующей записью.

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

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

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

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

    Проверка механизма обработки SQL-ошибок


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

    Для выполнения такого теста временно создадим в SQL-запросе вышеупомянутой функции getLineThreeColumnThreeСondition() какую-нибудь ошибку. Например, в имени одного из полей вместо обратной кавычки ошибочно укажем одинарную, как показано ниже (выделено красным цветом).

    1. //----Универсальная функция вывода одиночной строки по трем значениям в трех полях----

    2. function getLineThreeColumnThreeСondition($table, $column_1, $value_1, $column_2, $value_2, $column_3, $value_3) {

    3. global $mysqli;

    4. if (!$result = $mysqli->query("SELECT * FROM `$table` WHERE '$column_1`='$value_1' AND `$column_2`='$value_2' AND `$column_3`='$value_3'")) {

    5. trigger_error ('При выполнении SQL-запроса возникла ошибка: код ошибки - '.$mysqli->errno.', описание - ' .$mysqli->error, E_USER_ERROR);

    6. }

    7. return $result->fetch_assoc();

    8. }

    9. ?>

    Рис.3 Функция с ошибкой в SQL-запросе

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

    Как следовало ожидать, при формировании динамической страницы скрипт PHP с такой ошибкой в SQL-запросе не смог выполнить извлечение данных из БД. От чего последовало перенаправление на страницу 500, отправка по email оповещения о возникновении критической ошибки PHP и запись в журнал соответствующего сообщения.

    Рис.4 Перенаправление на страницу 500 при возникновении ошибки в SQL-запросе

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

    Рис.5 Каталог со вновь созданным лог-файлом SQL-ошибок

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

    Рис.6 Сохраненная в лог-файле информация об ошибке

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

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

    Исходные файлы сайта


    Знак папкиИсходные файлы сайта с обновлениями, которые были сделаны в данной статье, можно скачать из прилагаемых дополнительных материалов:

    • Файлы каталога www
    • Таблицы базы данных MySQL

    Дополнительные материалы бесплатно предоставляются только зарегистрированным пользователям.

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

    Для тех кто не зарегистрирован, можно это сделать на вкладке Регистрация.

    С уважением,


    Комментарии


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

    Буду Вам за это очень признателен!