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
$valueenthä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 Wert123und merkt sich: „Wennexecute()aufgerufen wird, muss an die Stelle:idder Wert123eingesetzt 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.
