Как отладить запросы базы данных PDO?

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

Подготовленные операторы PDO быстрее и лучше и более безопасны, но одна вещь беспокоит меня: Я никогда не вижу заключительного запроса, когда он отправляется в базу данных. Когда я получаю ошибки о синтаксисе в моем журнале Apache или моем пользовательском файле журнала (я регистрирую ошибки внутри a catch блок), я не вижу запроса, который вызвал их.

Существует ли путь, получают полный SQL-запрос, отправленный PDO в базу данных, и регистрируют его в файл?

133
задан Nathan Long 9 March 2010 в 17:43
поделиться

3 ответа

Просмотр журнала базы данных

Хотя Паскаль МАРТИН верен, PDO не отправляет полный запрос в базу данных все сразу же предложение ryeguy использовать функцию ведения журнала БД фактически позволило мне увидеть полный запрос, собранный и выполненный базой данных.

Вот как: (Эти инструкции предназначены для MySQL на компьютере под управлением Windows - ваш опыт может отличаться)

  • В my.ini в разделе [mysqld] добавьте команду log , например log = "C: \ Program Files \ MySQL \ MySQL Server 5.1 \ data \ mysql.log"
  • Перезапустите MySQL.
  • Он начнет регистрировать каждый запрос в этом файле.

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

84
ответ дан 24 November 2019 в 00:02
поделиться

№. Запросы PDO не подготавливаются на стороне клиента. PDO просто отправляет SQL-запрос и параметры на сервер базы данных. База данных - это то, что делает подстановка (из ? ). У вас есть два варианта:

  • Использовать функцию ведения журнала вашей БД (но даже тогда она обычно отображается как два отдельных оператора (т. Е. «Не окончательный»), по крайней мере, с Postgres)
  • Вывести SQL-запрос и {{1} } paramaters и соберите их вместе сами
8
ответ дан 24 November 2019 в 00:02
поделиться

Вы говорите следующее:

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

Ну, на самом деле, при использовании подготовленных операторов не существует такой вещи, как " final query «:

  • Сначала в базу данных отправляется инструкция, которая там подготавливается
    • База данных анализирует запрос и строит его внутреннее представление
  • И, когда вы привязываете переменные и выполняете оператор, только переменные отправляются в базу данных
    • И база данных "вставляет" значения в свои внутреннее представление оператора


Итак, чтобы ответить на ваш вопрос:

Есть ли способ захватить полный SQL-запрос, отправленный PDO в базу данных , и записать его в файл?

Нет: поскольку нигде нет « полного SQL-запроса », нет возможности его захватить.


Лучшее, что вы можете сделать для целей отладки, - это «воссоздать» «настоящий» SQL-запрос, вставив значения в строку SQL оператора.

В подобных ситуациях я обычно делаю следующее:

  • выводю код SQL, соответствующий оператору, с заполнителями
  • и использую var_dump (или эквивалент) сразу после этого, чтобы отобразить значения параметров
  • Обычно этого достаточно, чтобы увидеть возможную ошибку, даже если у вас нет «настоящего» запроса, который можно было бы выполнить.

Это не очень хорошо, когда дело доходит до отладки - но это цена подготовленных операторов и те преимущества, которые они приносят.

97
ответ дан 24 November 2019 в 00:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: