如何在不执行的情况下获取Pear MDB2生成的SQL?

时间:2011-06-08 19:44:18

标签: php sql pear mdb2

我正在使用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()来查看$stmt->query生成的SQL和值的占位符。我希望看到execute()生成的已完成的SQL,其值替换占位符 ,而不实际将查询发送到数据库

我该怎么做?

2 个答案:

答案 0 :(得分: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';

答案 1 :(得分:0)

print_r ($db->last_query, true);