2011-06-08 55 views
1

我正在用PHP 5.3与Pear MDB2一起工作。我正在编写一个更新数据库的项目,在让它开始更改数据之前,我想查看autoPrepare()和execute()生成的SQL查询在实际执行之前的样子。如何获取Pear MDB2生成的SQL而不执行它?

我打算这样创建和执行更新查询:

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

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

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

我该怎么做?

回答

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'; 
+0

哦,我知道了...我想我早就听说过这件事,但我忘了它。它与Pear MDB2'autoExecute()'(不是'autoPrepare()')方法有什么不同?文档(http://pear.php.net/manual/en/package.database.mdb2.intro-auto.php)似乎表明查询将包含列值而不是占位符。 – 2011-06-10 13:15:53

+0

@L S:从代码中我可以看到,'autoExecute'调用'autoPrepare',所以不会有任何区别。 – netcoder 2011-06-10 13:22:55

0
print_r ($db->last_query, true); 
+0

感谢您的建议,但是在***调用'$ stmt-> execute()'之后,这只能工作***吗?我需要在***之前访问完成的SQL语句***。 – 2013-07-24 13:07:02

相关问题