Как я могу просмотреть содержание подготовленного оператора?

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

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

Я хотел бы видеть SQL-оператор после того, как переменными заменяют.

21
задан Stomped 20 February 2010 в 22:18
поделиться

3 ответа

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

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

На стороне PHP нет «построения» SQL-запроса, поэтому нет никакого способа получить этот запрос.

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

20
ответ дан 29 November 2019 в 20:55
поделиться
Для подготовленных операторов, которые выполняются с помощью функций C API mysql_stmt_prepare () и mysql_stmt_execute (), сервер записывает строки Prepare и Execute в общий журнал запросов, чтобы вы могли узнать, когда операторы подготовлены и выполнены.
[...] сервер записывает следующие строки в общий журнал запросов:
Prepare [1] SELECT?
Execute [1 ] SELECT 3

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

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

echo "<pre>Debug: start</pre>\n";

$mysqli = new mysqli('localhost', 'localonly', 'localonly', 'test');
if ($mysqli->connect_error) {
  die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}

$result = $mysqli->query('CREATE TEMPORARY TABLE foo (id int auto_increment, x int, primary key(id))');
if ( false=== $result) { 
 die('error : '. $mysqli->error);
}

$stmt = $mysqli->prepare('INSERT INTO foo (x) VALUES (?)');
if ( false===$stmt ) {
  die ('prepare() failed: ' . $mysqli->error);
}

$result = $stmt->bind_param('i', $x);
if ( false===$result ) {
  die('bind_param() failed');
}

$x = 1;
$result = $stmt->execute();
if ( false===$result ) {
  die('execute() failed: '.$stmt->error);
}

echo "<pre>Debug: end</pre>\n";
12
ответ дан 29 November 2019 в 20:55
поделиться

Согласен с Pascal MARTIN (+1), поэтому предлагаю другую технику для отладки: var_dump() или логировать каждую переменную, которую вы вставляете в оператор, таким образом вы сможете понять, что это - неправильные данные или логически неправильный SQL.

0
ответ дан 29 November 2019 в 20:55
поделиться
Другие вопросы по тегам:

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