This function doesn't print parameter values despite the documentation says it does. See https://bugs.php.net/bug.php?id=52384 (filed back in 2010).
(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.9.0)
PDOStatement::debugDumpParams — Gibt Informationen über einen vorbereiteten SQL-Befehl aus
Scheibt die in einer vorbereiteten Anweisung enthaltenen Informationen
direkt in die Ausgabe. Ausgegeben werden die verwendete
SQL
-Abfrage, die Anzahl der verwendeten Parameter
(Params
), die Liste der Parameter mit ihrem
Schlüsselnamen oder ihrer Position, ihren Namen, ihre Position in der
Abfrage (falls dies vom PDO-Treiber unterstützt wird, andernfalls ist es
-1), ihren Typ (param_type
) als Ganzzahl und einen
booleschen Wert is_param
.
Dies ist eine Debug-Funktion, die die Daten direkt in die normale Ausgabe schreibt.
Bei allem, dessen Ergebnisausgabe direkt im Browser angezeigt wird, können Sie die Funktionen zur Ausgabesteuerung verwenden. Damit lässt sich die Ausgabe dieser Funktion erfassen, und - zum Beispiel - in einem string speichern.
Hierbei werden nur die Parameter ausgegeben, die zum Zeitpunkt der Ausgabe in der Anweisung enthalten sind. Überzählige Parameter werden nicht in der Anweisung gespeichert und daher auch nicht angezeigt.
Diese Funktion besitzt keine Parameter.
Version | Beschreibung |
---|---|
7.2.0 | PDOStatement::debugDumpParams() gibt nun den an die Datenbank gesendeten SQL-Befehl zurück, einschließlich der vollständigen, rohen Abfrage (einschließlich der ersetzten Platzhalter mit ihren gebundenen Werten). Zu beachten ist, dass dies nur zur Verfügung steht, wenn emulierte vorbereitete Anweisungen aktiviert sind. |
Beispiel #1 PDOStatement::debugDumpParams()-Beispiel mit benannten Parametern
<?php
/* Ausführen einer vorbereiteten Anweisung durch Binden von PHP-Variablen */
$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();
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
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
Beispiel #2 PDOStatement::debugDumpParams()-Beispiel mit Fragezeichen-Parametern
<?php
/* Ausführen einer vorbereiteten Anweisung durch Binden von PHP-Variablen */
$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();
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
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
This function doesn't print parameter values despite the documentation says it does. See https://bugs.php.net/bug.php?id=52384 (filed back in 2010).
As noted, this doesn’t actually simply print the prepared statement with data to be executed.
For trouble shooting purposes, I find the following useful:
<?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;
}
// Index Parameters
$string='INSERT INTO stuff(name,value) VALUES (?,?)';
$data=array('Fred',23);
// Named Parameters
$string='INSERT INTO stuff(name,value) VALUES (:name,:value)';
$data=array('name'=>'Fred','value'=>23);
print parms($string,$data);
?>
This function doesn't have a return, so if you want to do something with it you'll have to do something like
<?php
function pdo_debugStrParams($stmt) {
ob_start();
$stmt->debugDumpParams();
$r = ob_get_contents();
ob_end_clean();
return $r;
}
// omitted: connect to the database and prepare a statement
echo '<pre>'.htmlspecialchars(pdo_debugStrParams($stmt)).'</pre>';
?
Source: http://stackoverflow.com/questions/22157331/something-like-debugdumpparams-in-pdo-settable-to-a-string
Using PHP 8.3 and MySQL 8.2, debugDumpParams() DOES display the "raw" SQL, with parameter values.
E.g.
$sql = "SELECT tid, miv_title, ballot_order FROM title WHERE tid LIKE :tid AND ballot_order = :order";
$stm = $pdo->prepare($sql);
$stm->bindValue(":tid", "mi:%");
$stm->bindValue(":order", 5000, PDO::PARAM_INT);
$stm->execute();
$stm->debugDumpParams();
... displays ...
SQL: [92] SELECT tid, miv_title, ballot_order FROM title WHERE tid LIKE :tid AND ballot_order = :order
Sent SQL: [92] SELECT tid, miv_title, ballot_order FROM title WHERE tid LIKE 'mi:%' AND ballot_order = 5000
Params: 2
Key: Name: [4] :tid
paramno=-1
name=[4] ":tid"
is_param=1
param_type=2
Key: Name: [6] :order
paramno=-1
name=[6] ":order"
is_param=1
param_type=1