【问题标题】:how to get SQL generated by Pear MDB2 without executing it?如何获取 Pear MDB2 生成的 SQL 而不执行它?
【发布时间】:2011-06-08 19:44:17
【问题描述】:

我正在使用带有 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);

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

我该怎么做?

【问题讨论】:

    标签: php sql pear mdb2


    【解决方案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';
    

    【讨论】:

    • 哦,我明白了……我想我很久以前就听说过,但我忘记了。 Pear MDB2 autoExecute()(不是autoPrepare())方法有什么不同吗?文档(pear.php.net/manual/en/package.database.mdb2.intro-auto.php)似乎暗示查询将包含列值而不是占位符。
    • @L S:从我在代码中看到的,autoExecute 调用autoPrepare,所以不会有任何区别。
    【解决方案2】:
    print_r ($db->last_query, true);
    

    【讨论】:

    • 感谢您的建议,但这难道不是只有 $stmt->execute() 的调用完成后才有效吗?我需要访问完成的 SQL 语句之前
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多