#php #sql #pear #mdb2
#php #sql #pear #mdb2
Вопрос:
Я работаю с Pear MDB2 с PHP 5.3. Я кодирую проект, который обновляет базу данных, и прежде чем я позволю ему начать изменять данные, я хотел бы посмотреть, как выглядят SQL-запросы, сгенерированные autoPrepare () и execute(), перед их фактическим выполнением.
Я планирую создать и выполнить запрос на обновление, подобный этому:
$stmt = $db->extended->autoPrepare($tableName, $tableColumns,
MDB2_AUTOQUERY_UPDATE, 'id = ' . $db->quote(12345, 'integer'),
$tableColumnTypes));
$res =amp; $stmt->execute($tableColumnValues);
Я уже знаю, что могу видеть SQL, сгенерированный autoPrepare()
с помощью заполнителей для значений, путем доступа $stmt->query
. Я хотел бы видеть завершенный SQL, сгенерированный execute()
, со значениями, замененными на заполнители, без фактической отправки запроса в БД.
Как я могу это сделать?
Ответ №1:
Подготовленные инструкции компилируются на стороне сервера, поэтому вы не можете увидеть их до их выполнения. Например, в MySQL, если вы хотите выполнить подготовленную инструкцию, MDB2 на самом деле выполняет следующее:
PREPARE stmt FROM 'SELECT * FROM foo WHERE bar = ?';
SET @baz = 'baz';
EXECUTE stmt USING @baz;
Сервер никогда не «возвращает» фактический запрос, который он выполнил. Если вы хотите увидеть, какой запрос был выполнен, вам придется настроить журнал запросов.
Например, в MySQL (my.cnf):
[mysqld]
general_log_file = /var/log/mysql_queries.log
general_log = 1
Для приведенного выше примера запроса будет показан журнал запросов:
Query PREPARE stmt FROM 'SELECT * FROM foo WHERE bar = ?';
Query SET @baz = 'baz';
Query EXECUTE stmt USING @baz;
Execute SELECT * FROM foo WHERE bar = 'baz';
Комментарии:
1. О, я понимаю… Я думаю, что слышал об этом задолго до этого, но забыл. Отличается ли это от метода Pear MDB2
autoExecute()
(неautoPrepare()
)? Документация ( pear.php.net/manual/en/package.database.mdb2.intro-auto.php ), похоже, предполагает, что запрос будет содержать значения столбцов, а не заполнители.2. @L S: Из того, что я вижу в коде, это
autoExecute
вызовыautoPrepare
, так что никакой разницы не было бы.
Ответ №2:
print_r ($db->last_query, true);
Комментарии:
1. Спасибо за предложение, но разве это не работает только после завершения вызова
$stmt->execute()
? Перед этим мне нужно получить доступ к завершенной инструкции SQL.