Можно ли экспортировать запрос, отформатированный mysqli::prepare
и ::bind_param
?
Пример:
<?php $mysqli = new mysqli('host', 'user', 'pass', 'table'); if(mysqli_connect_errno()){ printf('Connect failed: %s\n', mysqli_connect_error()); exit; } $data=7290; if ($stmt = $mysqli->prepare('SELECT `id`,`info` FROM `propertys` WHERE id>?')){ $stmt->bind_param('i',$data); $stmt->execute(); $stmt->bind_result($id,$info); while($q=$stmt->fetch()){ echo $id,': ',$info,'<br>'; } $stmt->close(); } $mysqli->close(); ?>
в<?php $mysqli = new mysqli('host', 'user', 'pass', 'table'); if(mysqli_connect_errno()){ printf('Connect failed: %s\n', mysqli_connect_error()); exit; } $data=7290; if ($stmt = $mysqli->prepare('SELECT `id`,`info` FROM `propertys` WHERE id>?')){ $stmt->bind_param('i',$data); $stmt->execute(); $stmt->bind_result($id,$info); while($q=$stmt->fetch()){ echo $id,': ',$info,'<br>'; } $stmt->close(); } $mysqli->close(); ?>
Я хотел бы экспортировать функции QUERY
выполняемые mysql::prepare
и bind_param
поэтому (это мнимый пример):
if ($stmt = $mysqli->prepare('SELECT `id`,`info` FROM `propertys` WHERE id>?')){ $stmt->bind_param('i',$data); $stmt->execute(); echo $stmt->exportQuery();//Function does not exist, just for example
Функция ::exportQuery
будет печататься следующим образом:
SELECT `id`,`info` FROM `propertys` WHERE id>7290
есть ли какое-нибудь решение?
Благодарю.
Я знаю, что это было бы полезно для отладки, но это не так, как работают подготовленные заявления. Параметры не объединены с подготовленным оператором на стороне клиента. PHP никогда не должен иметь доступ к строке запроса в сочетании с ее параметрами.
Оператор SQL отправляется на сервер базы данных при подготовке (), а параметры отправляются отдельно, когда вы выполняете (). Общий журнал запросов MySQL показывает окончательный SQL со значениями, интерполированными после выполнения (). Ниже приведен фрагмент моего основного журнала запросов. Я запускал запросы из CLI mysql, а не из PHP, но принцип тот же.
081016 16:51:28 2 Query prepare s1 from 'select * from foo where i = ?' 2 Prepare [2] select * from foo where i = ? 081016 16:51:39 2 Query set @a =1 081016 16:51:47 2 Query execute s1 using @a 2 Execute [2] select * from foo where i = 1
Ваш комментарий:
@Baily правильно, у MySQL нет клиентского решения для возврата полного запроса с параметрами, интерполированными. Это не ошибка PHP.
Чтобы включить регистрацию, о которой я упоминал выше, используйте эту команду либо в клиенте MySQL, либо передайте ее через PHP через API:
SET GLOBAL general_log = ON;
Вы должны отключить журнал, когда будете собирать информацию, потому что для каждого запроса требуется некоторое количество накладных расходов.
SET GLOBAL general_log = OFF;
PS: Изменение параметров ведения журнала динамически требует MySQL 5.1 или новее. В более ранних версиях вы должны перезапустить mysqld при изменении ведения журнала.
Подготовленные утверждения не работают так, это причина, по которой вы не можете видеть утверждение, потому что оно должно быть передано в базу данных без манипуляций.
Таким образом, единственным решением является просто привязать ваши данные к вашей строке, а также эхо или сохранить в переменной.
РЕДАКТИРОВАТЬ, чтобы включить в себя проблему безопасности, о которой вы прокомментировали.
//Assume you're using $_GET to get the id $data = mysql_real_escape_string($_GET['yourID']); $yourStatement = 'SELECT `id`,`info` FROM `propertys` WHERE id>'; $savedStatement = $yourStatement.$data; echo $savedStatement; //Will return 'SELECT `id`,`info` FROM `propertys` WHERE id>4' if ($stmt = $mysqli->prepare($yourStatement.'?')){ $stmt->bind_param('i',$data); $stmt->execute(); }
Вы можете просто повторить строку запроса в эхо-строке и вручную разместить переменные в строке:
if ($stmt = $mysqli->prepare('SELECT `id`,`info` FROM `propertys` WHERE id>?')){ $stmt->bind_param('i',$data); if($stmt->execute()){ echo 'SELECT `id`,`info` FROM `propertys` WHERE id>'.$data; }; }
Большая часть комментариев, которые вы указали, указывает, что ваш вопрос был на самом деле:
Как показать последние запросы, выполняемые в MySQL?