儘管文件中說明會印出參數值,但這個函式並不會印出參數值。請參閱 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
函數 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
函數 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