как получить SQL, сгенерированный Pear MDB2, не выполняя его?

#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.