Hauptmenü

Untermenü

PDO - Methoden - Die PDOStatement-Klasse - Platzhalter setzen

1. Die grundsätzlichen Möglichkeiten

Im Gegensatz zu MySQLi hat man hier die Wahl! Man kann also die Platzhalter durch die Reihenfolge setzen oder "eigene Variablen" festlegen.

2. Über die Reihenfolge

Im Query geschieht das mit dem (hoffentlich) schon bekannten Fragezeichen.


$query 'INSERT INTO bla (blubb, blubber) VALUES (?, ?)';

Das Ersetzen erfolgt dann wie gehabt über die Reihenfolge.


$blubb   1;
$blubber 'blubber';
$query   'INSERT INTO bla (blubb, blubber) VALUES (?, ?)';
...
$stmt   -> bindFunktion(1$blubb, [Typ]);
$stmt   -> bindFunktion(2$blubber, [Typ]);

3. Über "eigene Variablen"

In diesem Fall arbeitet man nicht mit dem Fragenzeichen sondern mit einer konkreten Angabe, die mit einem Doppelpunkt beginnt.


$laber   1;
$schwall 'jodelbla';
$query   'INSERT INTO bla (blubb, blubber) VALUES (:blubb, :blubber)';
...
$stmt   -> bindFunktion(':blubb'$laber, [Typ]);
$stmt   -> bindFunktion(':blubber'$schwall, [Typ]);

4. Die Fehlerbehandlung

... ist in diesem Fall leider ganz mies gelöst worden. Oder genauer gesagt, sie existiert praktisch nicht. Denn es wird nur geprüft, ob der Platzhalter im Query mit dem ersten Wert der bindFunktion übereinstimmt. Und das war es schon.

Beispiele


$query   'INSERT INTO bla (blubb) VALUES (:blubb)';
$stmt   -> bindFunktion('#blubb'$laber);

Bei dieser Kombination fliegt dem geneigten Betrachter eine Meldung à la Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined ... um die Ohren, während bei den beiden folgenden Varianten nichts, aber auch gar nichts passiert. Außer, dass man kein Ergebnis bekommt.


$query   'INSERT INTO bla (blubb) VALUES (#blubb)';
$stmt   -> bindFunktion(':blubb'$laber);

$query   'INSERT INTO bla (blubb) VALUES (#blubb)';
$stmt   -> bindFunktion('#blubb'$laber);

Wenn man so was vermeiden will, muss man prüfen, ob der Rückgabewert der bindFunktion ein true oder false ist.


$query 'INSERT INTO bla (blubb) VALUES (#blubb)';
if($stmt -> bindFunktion(':blubb'$laber)) {
  ...
}
else {
  ...
}


zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt