可能重复:
PDO Prepared Statements
我确信答案很简单,但我似乎找不到它。
我正在使用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();
答案 0 :(得分:3)
您无法获取发送到服务器的查询,因为PDO不能以这种方式工作。
它将$ query和$ id单独发送到服务器数据库,这些数据库在加入数据库后执行。
答案 1 :(得分:3)
通常的做法是在绑定值旁边打印查询(其中包含占位符)。使用样式:placeholder => value
的数组时,您只需var_dump
,print_r
或var_export
数组。
例如,这在Magento SQL调试中完成。
“final”查询不作为字符串存在,除非PDO驱动程序不支持预处理语句并且它正在模拟它们。
实质上,您可以将预准备语句视为存储函数或存储过程。您可以创建一次并使用多个参数多次执行它。
答案 2 :(得分:2)
使用它:
/**
* 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;
}
来源:View and debug prepared PDO query without looking at MySQL logs