我正在使用PHP 5.3的Pear MDB2.我编码一个项目,更新了数据库之前,我让它开始变化的数据,我想看看有什么()由autoPrepare生成的SQL查询和执行()看起来像之前实际执行它们.
我计划创建并执行这样的更新查询:
$stmt = $db->extended->autoPrepare($tableName, $tableColumns,
MDB2_AUTOQUERY_UPDATE, 'id = ' . $db->quote(12345, 'integer'),
$tableColumnTypes));
$res =& $stmt->execute($tableColumnValues);
Run Code Online (Sandbox Code Playgroud)
我已经知道我可以autoPrepare()通过访问来查看由占位符生成的SQL的SQL $stmt->query.我想看看生成的已完成的SQL execute(),用值代替占位符,而不实际将查询发送到数据库.
我怎样才能做到这一点?
准备好的语句在服务器端编译,因此在执行之前无法看到它们.例如,在MySQL中,如果要执行预准备语句,MDB2实际上做的是:
PREPARE stmt FROM 'SELECT * FROM foo WHERE bar = ?';
SET @baz = 'baz';
EXECUTE stmt USING @baz;
Run Code Online (Sandbox Code Playgroud)
服务器永远不会"返回"它执行的实际查询.如果你想看到什么查询被执行,你必须建立一个查询日志.
例如,在MySQL(my.cnf)中:
[mysqld]
general_log_file = /var/log/mysql_queries.log
general_log = 1
Run Code Online (Sandbox Code Playgroud)
对于上面的查询示例,查询日志将显示:
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';
Run Code Online (Sandbox Code Playgroud)