PHP Conference Japan 2024

PDOStatement::debugDumpParams

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.9.0)

PDOStatement::debugDumpParams 转储 SQL 预处理命令

描述

public PDOStatement::debugDumpParams(): ?bool

将预处理语句包含的信息直接转储到输出中。它将提供正在使用的 SQL 查询、使用的参数数量 (Params)、参数列表及其键名或位置、名称、在查询中的位置(如果 PDO 驱动程序支持,否则为 -1)、类型 (param_type) 作为整数以及布尔值 is_param

这是一个调试函数,它将数据直接转储到标准输出。

提示

与任何将结果直接输出到浏览器的功能一样,可以使用 输出控制函数 捕获此函数的输出,并将其保存到 字符串(例如)中。

这只会转储语句在转储时的参数。额外的参数不会存储在语句中,也不会显示。

参数

此函数没有参数。

返回值

在发生错误的情况下返回 nullfalse

变更日志

版本 描述
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

参见

添加注释

用户贡献的注释 3 个注释

thefox
11 年前
尽管文档中说它会打印参数值,但此函数实际上并没有打印。请参阅 https://bugs.php.net/bug.php?id=52384(于 2010 年提交)。
mark at manngo dot net
11 年前
如前所述,这实际上并没有简单地打印要执行的预处理语句及其数据。

出于故障排除的目的,我发现以下内容很有用

<?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);
?>
Lucas
8 年前
此函数没有返回值,因此如果您想对其进行操作,则必须执行以下操作

<?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
To Top