Обработка ошибок MySQL в хранимых процедурах

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

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

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

Объявление обработчика

Чтобы объявить обработчик мы используем оператор DECLARE HANDLER :

Если значение условия совпадает со значением condition_value , MySQL выполнит оператор statement и продолжит или завершит текущий блок кода, исходя из значения action .

action может принимать следующие значения:

  • CONTINUE : исполнение блокированного кода (BEGIN … END) продолжается;
  • EXIT : выполнение блокированного кода, в котором был объявлен обработчик, завершается.

condition_value задает конкретное условие или класс условия, которые активируют обработчик.

condition_value может принимать одно из следующих значений:

  • код ошибки MySQL ;
  • стандартное значение SQLSTATE . Или это может быть условие SQLWARNING , NOTFOUND или SQLEXCEPTION , которое является сокращением для класса значений SQLSTATE . Условие NOTFOUND используется для курсора или оператора SELECT INTO variable_list ;
  • название условия, связанного либо с кодом ошибки MySQL , либо со значением SQLSTATE .

В качестве statement может использоваться простой оператор или составной оператор, вшитый с помощью ключевых слов BEGIN и END .

Примеры обработки ошибок MySQL

Давайте рассмотрим несколько примеров объявления обработчиков.

Обработчик, приведенный ниже, означает: когда происходит ошибка, устанавливается значение переменной has_error 1 и выполнение продолжается:

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

Если вы объявляете его внутри блока BEGIN END хранимой процедуры, он немедленно завершает хранимую процедуру:

Если строк для вывода больше нет, для вариантов cursor или оператора SELECT INTO , значение переменной no_row_found устанавливается равным 1 и продолжается исполнение:

При возникновении ошибки дублирования ключа, выдается ошибка MySQL 1062 . Следующий обработчик выдает сообщение об ошибке и продолжает выполнение:

Пример обработчика MySQL в хранимых процедурах

Во-первых , для демонстрации мы создаем новую таблицу с именем article_tags :

В таблице article_tags хранятся связи между статьями и тегами. К каждой статье может относиться несколько тегов и наоборот.

Для простоты, мы не будем создавать таблицы articles и tags , а также внешние ключи в таблице article_tags .

Во-вторых , мы создаем хранимую процедуру, которая вставляет пару идентификаторов статьи и тега в таблицу article_tags :

В-третьих , для статьи 1 мы добавляем идентификаторы тега 1, 2 и 3, с помощью вызова хранимой процедуры insert_article_tags :

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

Мы получили сообщение об ошибке. Однако, поскольку мы объявили тип обработчика CONTINUE , хранимая процедура продолжает исполняться.

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

Теперь, мы можем попробовать добавить дубликат ключа, чтобы увидеть результат:

Приоритет обработчиков MySQL

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

Ошибка всегда обозначается одним из кодов ошибки MySQL , так что MySQL в этом плане имеет возможность четко их идентифицировать.

Обозначения SQLSTATE для многих кодов ошибок MySQL менее специфичны. SQLEXCPETION или SQLWARNING представляют собой сокращения класса значений SQLSTATES , поэтому они имеют общий характер.

На основании правил приоритета обработчиков обработчик кода ошибки MySQL , обработчик SQLSTATE и обработчик SQLEXCEPTION имеют приоритеты один, два и три соответственно.

Предположим, что в хранимой процедуре insert_article_tags_3 мы объявляем три обработчика:

Теперь мы пробуем добавить в таблицу article_tags дубликат ключа через вызов хранимой процедуры:

Как видите, вызывается обработчик кода ошибки MySQL :

Использование проименованных условий ошибки

Начинаем с объявления обработчика ошибки:

Что означает код 1051 ? Представьте, что у вас есть большая хранимая процедура, по всему коду которой разбросаны некорректные значения. Настоящий кошмар для разработчиков обслуживания.

К счастью, MySQL предоставляет нам оператор DECLARE CONDITION , который объявляет проименованное условие ошибки, связанное с условием.

Синтаксис оператора DECLARE CONDITION выглядит следующим образом:

condition_value может представлять собой код ошибки MySQL , например 1015 , или значение SQLSTATE . condition_value представляется с помощью condition_name .

После объявления вы можете обращаться к condition_name вместо condition_value .

Таким образом, мы можем переписать код, приведенный выше, следующим образом:

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

Коды ошибок в PHP, их вывод и ловля на живца с помощью недосыпания

Коды ошибок в PHP

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

Если их не видно

Причин, почему ошибки не выводятся на экране, может быть несколько:

Их вывод отключен хостером специально – таким образом он заботится о повышении безопасности своего серверного пространства. В том числе и вашего ресурса. И все потому, что в описаниях некоторых ошибок отладчик выводит конфиденциальную информацию. Умелый хакер сможет легко использовать ее для взлома вашего сайта. Например, при указании неправильного пароля при подключении к базе, расположенной на сервере MySQL. В результате на экран выводится описание ошибки, содержащее логин активного пользователя СУБД.

В настройках ядра языка.

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков 15 часов видео исходники для каждого урока

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

Перед тем, как найти ошибку коде PHP, сначала нужно ее вывести на экран. Если это не происходит, тогда прямая дорога в php. ini. Здесь нужно активировать значения нескольких параметров:

Данные настройки расположены в разделе «Error handling and logging».

Коды ошибок в PHP

Логов нет!

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

В Денвере данная функция (по умолчанию) отключена. Это можно легко исправить, прописав нужный код в конфигурационном файле (в том же разделе).

Снова откройте php. ini и внесите в него выделенные ниже строки. Точнее, одна из них уже должна быть, но лучше проверить. С помощью этих директив (log_errors и error_log) разрешается запись сообщений обо всех ошибках. А также задается путь к файлу логов, с помощью которого вы сможете осуществить PHP проверку кода на ошибки.

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков 15 часов видео исходники для каждого урока

Коды ошибок в PHP

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

Проверяем

Теперь проверим, что у нас вышло. Для этого запустим умышленную синтаксическую неточность в коде: неправильно объявим переменную PHP.

Источники:

https://www. internet-technologies. ru/articles/obrabotka-oshibok-mysql-v-hranimyh-procedurah. html

https://webformyself. com/kody-oshibok-v-php-ix-vyvod-i-lovlya-na-zhivca-s-pomoshhyu-nedosypaniya/

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: