Я работаю над обучением использовать подготовленные операторы с mysqli в PHP и обычно, если у меня есть проблема с запросом, я просто повторяю его на экран для наблюдения то, на что это похоже как первый шаг.
Как я могу сделать это с подготовленным оператором?
Я хотел бы видеть SQL-оператор после того, как переменными заменяют.
Использование подготовленных операторов:
На стороне PHP нет «построения» SQL-запроса, поэтому нет никакого способа получить этот запрос.
Это означает, что если вы хотите увидеть SQL-запрос, вы должны использовать SQL-запросы, а не подготовленные операторы.
Для подготовленных операторов, которые выполняются с помощью функций 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";
Согласен с Pascal MARTIN (+1), поэтому предлагаю другую технику для отладки: var_dump()
или логировать каждую переменную, которую вы вставляете в оператор, таким образом вы сможете понять, что это - неправильные данные или логически неправильный SQL.