此函数尽管文档中说会打印参数值,但实际上并没有。请参见 https://bugs.php.net/bug.php?id=52384(于 2010 年提交)。
(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.9.0)
PDOStatement::debugDumpParams — 转储 SQL 预备命令
将预备语句中包含的信息直接转储到输出。它将提供正在使用的 SQL
查询、使用的参数数量 (Params
)、参数列表及其键名或位置、其名称、其在查询中的位置(如果 PDO 驱动程序支持,否则将为 -1)、类型 (param_type
) 作为整数,以及布尔值 is_param
。
这是一个调试函数,它将数据直接转储到标准输出。
这只会转储转储时语句中的参数。不会在语句中存储额外的参数,也不会显示它们。
此函数没有参数。
版本 | 描述 |
---|---|
7.2.0 | PDOStatement::debugDumpParams() 现在返回发送到数据库的 SQL,包括完整的原始查询(包括用绑定值替换的占位符)。注意,这只有在启用模拟预备语句时才可用。 |
示例 #1 PDOStatement::debugDumpParams() 使用命名参数的示例
<?php
/* 通过绑定 PHP 变量来执行预备语句 */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindValue(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
$sth->debugDumpParams();
?>
上面的示例将输出
SQL: [96] SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour Params: 2 Key: Name: [9] :calories paramno=-1 name=[9] ":calories" is_param=1 param_type=1 Key: Name: [7] :colour paramno=-1 name=[7] ":colour" is_param=1 param_type=2
示例 #2 PDOStatement::debugDumpParams() 使用未命名参数的示例
<?php
/* 通过绑定 PHP 变量来执行预备语句 */
$calories = 150;
$colour = 'red';
$name = 'apple';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < ? AND colour = ?');
$sth->bindParam(1, $calories, PDO::PARAM_INT);
$sth->bindValue(2, $colour, PDO::PARAM_STR);
$sth->execute();
$sth->debugDumpParams();
?>
上面的示例将输出
SQL: [82] SELECT name, colour, calories FROM fruit WHERE calories < ? AND colour = ? Params: 2 Key: Position #0: paramno=0 name=[0] "" is_param=1 param_type=1 Key: Position #1: paramno=1 name=[0] "" is_param=1 param_type=2
如前所述,它实际上并没有简单地打印要执行的预备语句及其数据。
出于故障排除的目的,我发现以下内容很有用
<?php
function parms($string,$data) {
$indexed=$data==array_values($data);
foreach($data as $k=>$v) {
if(is_string($v)) $v="'$v'";
if($indexed) $string=preg_replace('/\?/',$v,$string,1);
else $string=str_replace(":$k",$v,$string);
}
return $string;
}
// 索引参数
$string='INSERT INTO stuff(name,value) VALUES (?,?)';
$data=array('Fred',23);
// 命名参数
$string='INSERT INTO stuff(name,value) VALUES (:name,:value)';
$data=array('name'=>'Fred','value'=>23);
print parms($string,$data);
?>
此函数没有返回值,因此如果您想使用它,则需要执行类似以下操作
<?php
function pdo_debugStrParams($stmt) {
ob_start();
$stmt->debugDumpParams();
$r = ob_get_contents();
ob_end_clean();
return $r;
}
// 省略:连接数据库并准备语句
echo '<pre>'.htmlspecialchars(pdo_debugStrParams($stmt)).'</pre>';
?
来源: http://stackoverflow.com/questions/22157331/something-like-debugdumpparams-in-pdo-settable-to-a-string