четверг, 28 июля 2011 г.

Новый метод (очистка мультизапроса) вызвал неожиданные трудности

Оказалось, что крайне полезный метод clear_multiresult($result), о котором было написано здесь, не работает. 


Поиск проблемы был трудный и интересный. Не могу не написать об этом.

Как известно (из документации), метод $mysqli->multi_query() создает в процессе выполнения набор результатов по одному для каждого запроса, входящего в мультизапрос.

Для того, чтобы эти запросы вытаскивать на свет Божий и обрабатывать существуют 3 замечательных метода:
  • $mysqli->store_result()
  • $mysqli->next_result()
  • $mysqli->more_results() 
Кому интересны подробности - прошу обратиться к документации.

Скажу только, что загвоздка оказалась в методе $mysqli->next_result().

Предположим, у нас есть мультизапрос, состоящий из 4-х запросов. Причем в третьем запросе ошибка. Тогда мы будем действовать  следующим образом.
  • Выполним $mysqli->store_result(). Этим мы вытащим из недр API результат первого запроса.
  • Обработали результат и удалили его.
  • Выполняем подготовку второго запроса методом  $mysqli->next_result(). При этом метод вернет TRUE, что и ожидалось.
  • Выполним $mysqli->store_result(). Этим мы вытащим из недр API результат второго запроса.
  • Обработали результат и удалили его.
  • Выполняем подготовку третьего запроса методом  $mysqli->next_result(). При этом метод вернет FALSE, что абсолютно не ожидалось. При этом в документации черным по белому написано, что метод возвращает истину, если метод выполнился удачно, и ложь, если операция потерпела неудачу. Какая же тут неудача? Все вполне удачно, поскольку если не обращать внимания на возвращаемое значение метода, ошибочный результат все-таки подготавливается и можно двигаться дальше, то есть проверять на ошибки и тд и тп.
  • Не обращаем внимания на возвращаемое значение и выполняем $mysqli->store_result(). Этим мы вытащим из недр API результат второго запроса.
  • Обработали результат, то есть проверили его на ошибки, выявили ошибку и выполнили my_exit();
А как же проверять тот факт, что результаты кончились? Конечно методом $mysqli->more_results(). Он для этого и создан.


0 коммент.:

Отправить комментарий