Rolf B: PHP PDO Bind Parameters Wo sinnvoll?

Beitrag lesen

Hallo MB,

ich meine SQL Parameter und sonst nichts. Das Zusammenbauen eines SQL Strings in PHP ist ein anderes Thema. Da hast Du ganz andere Möglichkeiten.

Das Einsetzen von Werten für Parametern wie ? oder :name in einem SQL String ist etwas, das der Datenbanktreiber bzw. die Datenbank selbst durchführt. Und diese Werte dürfen eben nur Konstanten stehen, keine SQL Elemente wie Schlüsselwörter, Namen von Spalten oder Tabellen, oder ganze SQL Fragmente wie eine IN Klausel oder ein Subselect.

Beispiel 1: Spaltennamen

$stmt = $dbo->prepare("SELECT ? FROM myTable WHERE id=?");
$stmt->execute(array('name', 4));

ist NICHT das gleiche wie

$stmt = $dbo->query("SELECT name FROM myTable WHERE id=4")

sondern

$stmt = $dbo->query("SELECT 'name' FROM myTable WHERE id=4")

Dieses Statement würde eine Row mit einer Spalte liefern, deren Wert 'name' ist. Etwas anderes ist dies hier:

$spalte = "name";
$id = 4;
$stmt = $dbo->query("SELECT $spalte FROM myTable WHERE id=$id");

weil jetzt die Ersetzung von PHP durchgeführt wird, nicht von PDO. Du hast dann aber auch nur ein Einmalstatement, nichts, was prepared ist.

Beispiel 2: Tabellennamen

$stmt = $dbo->prepare("SELECT name, vorname FROM ? WHERE id=?");
$stmt->execute(array('myTable', 4));

würde schon im PREPARE scheitern, weil FROM ? unzulässig ist. Denn es ist NICHT das gleiche wie

$dbo->query("SELECT name, vorname FROM myTable WHERE id=4")

sondern

$dbo->query("SELECT name, vorname FROM 'myTable' WHERE id=4")

und das ist ein SQL Syntaxfehler.

Beispiel 3: SQL Fragmente

$stmt = $dbo->prepare("SELECT name, vorname FROM myTable WHERE id=?");
$stmt->execute(array('(SELECT id FROM foo WHERE x=47)'));

ist NICHT das gleiche wie

$dbo->query("SELECT name, vorname FROM myTable WHERE id=(SELECT id FROM foo WHERE x=47)")

sondern

$dbo->query("SELECT name, vorname FROM myTable WHERE id='(SELECT id FROM foo WHERE x=47)'")

d.h. du vergleichst die ID mit einem längeren String und nicht mit dem Ergebnis eines Subselects. Vermutlich ist das Ergebnis leer, oder es gibt sogar einen SQL Fehler.

Hat das geholfen?

Rolf

--
sumpsi - posui - clusi