Das Thema Platzhalter haben wir bereits besprochen. Hier soll es nun um eine sehr nützliche Methode gehen, die uns dabei hilft, Platzhalter einfacher zu verwenden: bindValue()
Wie die Methode $sth->bindValue(":" . $param, $value);
funktioniert
Analysieren wir diese Zeile Code im Detail. Sie wird oft in Schleifen oder in selbstgebauten Query-Buildern verwendet, um dynamisch Parameter zu binden.
Nehmen wir an, du hast folgende Variablen:
PHP
$param = 'id';
$value = 123;
Und dein Statement-Objekt $sth
enthält die vorbereitete Abfrage SELECT * FROM listings WHERE id = :id
.
Wenn du nun den Code aufrufst:
$sth->bindValue(„:“ . $param, $value);
Passiert folgendes, Schritt für Schritt:
":" . $param
(Der Platzhalter-Name):- Zuerst wird der String für den Platzhalter-Namen zusammengebaut.
- PHP nimmt den String
":"
und hängt den Inhalt der Variable$param
(also den String'id'
) daran an. - Das Ergebnis ist der String
":id"
.
$value
(Der zu bindende Wert):- Die Variable
$value
enthält den Wert, den wir sicher an die Datenbank übergeben wollen. In diesem Fall ist das die Zahl123
.
- Die Variable
$sth->bindValue(...)
(Die Aktion):- Die
bindValue()
-Methode wird auf demPDOStatement
-Objekt ($sth
) aufgerufen. - Sie nimmt den ersten Parameter (
":id"
) und sucht in der vorbereiteten SQL-Schablone nach einer Lücke mit genau diesem Namen. Sie findet sie:... WHERE id = :id
. - Jetzt nimmt sie den zweiten Parameter (
123
) und bindet diesen Wert an die gefundene Lücke. Sie macht quasi ein „Foto“ vom aktuellen Wert123
und merkt sich: „Wennexecute()
aufgerufen wird, muss an die Stelle:id
der Wert123
eingesetzt werden.“
- Die
Zusammengefasst: Diese Zeile ist eine dynamische Art zu sagen: „Binde den Wert aus der Variable $value
an den Platzhalter, dessen Name sich aus dem String ":"
und dem Inhalt der Variable $param
zusammensetzt.“
Ein praktischer Anwendungsfall
Stell dir vor, du möchtest eine UPDATE
-Anweisung dynamisch bauen:
PHP
$fields = [
'title' => 'Neuer Titel',
'city' => 'Berlin'
];
$id = 1;
$sql = "UPDATE listings SET title = :title, city = :city WHERE id = :id";
$sth = $pdo->prepare($sql);
// Binde die dynamischen Felder
foreach ($fields as $key => $value) {
$sth->bindValue(":" . $key, $value); // Hier wird :title und :city gebunden
}
// Binde die ID
$sth->bindValue(":id", $id);
// Führe alles aus
$sth->execute();
Hier siehst du, wie die dynamische Natur von ":" . $key
es dir erlaubt, mit einer Schleife flexibel eine beliebige Anzahl von Parametern sicher an dein Statement zu binden.