如何查看已准备好的PDO SQL语句

6

可能是重复问题:
PDO预处理语句

我相信这个问题的答案非常简单,但是我似乎找不到它。

我正在使用PDO(PHP数据对象)对MySQL数据库运行查询,并希望在其执行之前显示准备好的查询。这将非常有用。

是否有任何方法可以做到这一点?例如:

$query = 'SELECT Id, Name, Comment FROM Users WHERE Id = :id';
$pdoStatement = $db->prepare($query);
$pdoStatement->bindValue(':id', $id);

// How can I view the actual statement that will be executed, showing the real
// value that will be used in place of ':id'

$pdoStatement->execute();

这里讨论了如何调试PDO数据库查询:https://dev59.com/-HE95IYBdhLWcg3wMrEB 和 https://dev59.com/rVnUa4cB1Zd3GeqPfvuC。 - Bob
显然我没有搜索得太好,考虑到你们两个找到其他帖子的速度。 - Bryan
@Bryan 它是右侧相关问题面板中的第一个! - lonesomeday
@lonesomeday 我在谷歌上进行了几次搜索,但没有找到有用的结果,然后就直接发布了问题,没有检查相关的问题。我的错。还是非常感谢你的帮助。 - Bryan
1
debugDumpParams应该就是答案。 - vishal dharankar
谢谢@vishal,我之前不知道,看起来是个不错的解决方案。 - Bryan
3个回答

3

使用它:

/**
 * Replaces any parameter placeholders in a query with the value of that
 * parameter. Useful for debugging. Assumes anonymous parameters from 
 * $params are are in the same order as specified in $query
 *
 * @param string $query The sql query with parameter placeholders
 * @param array $params The array of substitution parameters
 * @return string The interpolated query
 */
public static function interpolateQuery($query, $params) {
    $keys = array();

    # build a regular expression for each parameter
    foreach ($params as $key => $value) {
        if (is_string($key)) {
            $keys[] = '/:'.$key.'/';
        } else {
            $keys[] = '/[?]/';
        }
    }

    $query = preg_replace($keys, $params, $query, 1, $count);

    #trigger_error('replaced '.$count.' keys');

    return $query;
}

来源:查看和调试已准备好的PDO查询,而无需查看MySQL日志


3

因为 PDO 不是以这种方式工作,所以你无法获取发送到服务器的查询。

PDO 是将 $query 和 $id 分别发送给服务器数据库的,然后通过数据库连接在服务器上执行。


3

常见的做法是将带有占位符的查询语句和绑定的值一起打印出来。如果使用类似于:placeholder => value的数组,您可以直接使用 var_dump, print_rvar_export 打印出该数组。

例如,在Magento SQL调试中会这样做。

除非PDO驱动程序不支持预处理语句并且正在模拟它们,否则“最终”查询不存在字符串形式。

从本质上讲,您可以将准备好的语句视为存储函数或存储过程。您只需创建一次,然后使用多个参数多次执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接