Как я могу просмотреть содержание подготовленного заявления? - PullRequest
20 голосов
/ 21 февраля 2010

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

Как я могу сделать это с подготовленным заявлением?

Я бы хотел видеть оператор SQL после замены переменных.

Ответы [ 6 ]

19 голосов
/ 21 февраля 2010

Использование подготовленных утверждений:

  • Когда вы готовите оператор, он отправляется на сервер MySQL
  • Когда вы связываете переменные + выполняете оператор, на сервер MySQL отправляются только переменные
  • И оператор + связанные переменные выполняются на сервере MySQL - без повторной «подготовки» каждый раз, когда выполняется оператор (именно поэтому подготовленные операторы могут быть хороши для производительности, когда один и тот же оператор выполняется несколько раз)

На стороне PHP не существует "построения" SQL-запроса, поэтому фактически невозможно получить этот запрос.

Это означает, что если вы хотите увидеть SQL-запрос, вы должны использовать SQL-запросы, а не подготовленные операторы.

12 голосов
/ 21 февраля 2010
Для подготовленных операторов, которые выполняются с помощью функций API C mysql_stmt_prepare () и mysql_stmt_execute () C, сервер записывает строки Prepare и Execute в общий журнал запросов, чтобы вы могли определить, когда операторы подготовлены и выполнены.
[...] сервер записывает следующие строки в общий журнал запросов:
Подготовить [1] ВЫБРАТЬ?
Выполнить [1] ВЫБРАТЬ 3

Так что для целей отладки активируйте общий журнал и следите за этим файлом.

edit: о, у вопроса есть тег [mysqli] ... полностью упущен из виду.
Если инструкция вообще не выполняется, проверили ли вы (double / tripple), что на этом пути не было ошибок?

<code>echo "<pre>Debug: start
\ п "; $ mysqli = new mysqli ('localhost', 'localonly', 'localonly', 'test'); if ($ mysqli-> connect_error) { die ('Ошибка подключения ('. $ mysqli-> connect_errno. ')'. $ mysqli-> connect_error); } $ result = $ mysqli-> query ('CREATE TEMPORARY TABLE foo (id int auto_increment, x int, первичный ключ (id))'); if (false === $ result) { die ('error:'. $ mysqli-> error); } $ stmt = $ mysqli-> prepare ('INSERT INTO foo (x) VALUES (?)'); if (false === $ stmt) { die ('prepare () не удалось:'. $ mysqli-> error); } $ result = $ stmt-> bind_param ('i', $ x); if (false === $ result) { die ('bind_param () не удалось'); } $ х = 1; $ result = $ stmt-> execute (); if (false === $ result) { die ('execute () не удалось:'. $ stmt-> error); } echo "
Debug: end
\ n";
3 голосов
/ 20 июня 2014

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

Пример подготовки и выполнения:

$sql = "SELECT VAL1, VAL2 FROM TABLE(?, '?', '?', '?', '?', ?, '?', '?', '?')";
$prep = ibase_prepare( $sql ) or die("Error");
$query = ibase_execute($prep, $param1, $param2, .....) or $err = true;
                              ^^^^^^^^^^^^^^^^^^^^^^^

Простой способ отладить результирующий SQL предложения:

printf( str_replace('?', '%s', $sql), $param1, $param2, ....);
                                      ^^^^^^^^^^^^^^^^^^^^^^

Вам нужно сделать только один printf, заменив ? в подготовленной строке SQL на один %s. printf будет интерпретировать все как одну строку, при этом каждый параметр будет помещен в каждый замененный %s.

0 голосов
/ 08 июля 2017

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

0 голосов
/ 26 июля 2014

Я недавно обновил этот проект, включив в него интеграцию с композитором, модульное тестирование и улучшенную обработку принимаемых аргументов по ссылке (для этого требуется обновление до php 5.6).


Я создал набор классов, которые расширяют классы mysqli и mysqli_stmt по умолчанию, чтобы вы могли просматривать представление потенциальной строки запроса, которая должна предоставить то, что вы ищете:

https://github.com/noahheck/E_mysqli

Это (близкая к) замена для обычного mysqli объекта, который возвращает пользовательский объект mysqli_stmt при prepare() строке запроса. После привязки ваших параметров E_mysqli позволит вам просмотреть результирующую строку запроса как новое свойство объекта stmt:

$mysqli = new E_mysqli($dbHost, $dbUser, $dbPass, $dbName);

$query = "INSERT INTO registration SET name = ?, email = ?";

$stmt = $mysqli->prepare($query);

$stmt->bind_param("ss", $_POST['name'], $_POST['email']);

$stmt->execute();

echo $stmt->fullQuery;

приведет к:

INSERT INTO registration SET name = 'John Doe', email = 'john.doe@example.com'

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

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

Отказ от ответственности - Как я уже сказал, я сделал это расширение.

0 голосов
/ 21 февраля 2010

Соглашаясь с Паскалем МАРТИНОМ (+1), поэтому я предлагаю другой метод отладки: var_dump() или регистрируйте каждую переменную, которую вы вставляете в оператор, таким образом, вы должны быть в состоянии выяснить, неверны ли данные или логически неправильный SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...