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();
4

3 回答 3

3

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

它将 $query 和 $id 分别发送到服务器数据库,服务器数据库在数据库加入后执行。

于 2012-06-22T12:43:32.083 回答
3

一种常见的做法是将查询(其中包含占位符)与绑定值一起打印。当使用样式数组时,:placeholder => value您可以只使用var_dump,print_rvar_export数组。

例如,这是在 Magento SQL 调试中完成的。

“最终”查询不作为字符串存在,除非 PDO 驱动程序不支持准备好的语句并且它正在模拟它们。

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

于 2012-06-22T12:43:38.453 回答
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 日志

于 2012-06-22T12:52:10.273 回答