1

我正在使用带有 PHP 5.3 的 Pear MDB2。我正在编写一个更新数据库的项目,在我让它开始更改数据之前,我想看看 autoPrepare() 和 execute() 生成的 SQL 查询在实际执行之前是什么样子。

我计划创建并执行这样的更新查询:

    $stmt = $db->extended->autoPrepare($tableName, $tableColumns,
    MDB2_AUTOQUERY_UPDATE, 'id = ' . $db->quote(12345, 'integer'),
    $tableColumnTypes));

    $res =& $stmt->execute($tableColumnValues);

我已经知道我可以autoPrepare()通过访问来查看由占位符生成的 SQL $stmt->query。我希望看到由 生成的完整 SQL execute(),用值替换占位符,而不实际将查询发送到 DB

我怎样才能做到这一点?

4

2 回答 2

5

准备好的语句是在服务器端编译的,所以在它们执行之前你是看不到它们的。例如,在 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';
于 2011-06-08T19:54:34.497 回答
0
print_r ($db->last_query, true);
于 2013-07-24T09:02:16.353 回答