2024 日本 PHP 研討會

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

這是一個除錯函式,它將數據直接傾印到標準輸出。

提示

與任何將結果直接輸出到瀏覽器的操作一樣,可以使用 輸出控制函式 來擷取此函式的輸出,並將其儲存到 字串 中(例如)。

這只會傾印語句在傾印時刻的參數。額外的參數不會儲存在語句中,也不會顯示。

參數

此函式沒有參數。

返回值

返回 null,或發生錯誤時返回 false

更新日誌

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