Das neue Client-Server-Protokoll, das MySQL seit Version 4.1 verwendet, unterstützt die Verwendung von vorbereiteten Anfragen. Diese ermöglichen eine effizientere Verarbeitung von Anfragen, die dynamisch zusammengesetzt werden. Hierzu werden die variablen Teile der Anfrage -- beispielsweise Werte, nach denen in einer Spalte einer Tabelle gesucht werden soll -- durch einen Platzhalter ersetzt. An diese Platzhalter können im Anschluss die entsprechenden Werte gebunden werden.
Eine vorbereitete Anfrage muss für die mehrmalige Ausführung mit unterschiedlichen Werten nur einmal an den Datenbankserver übermittelt (und dort für die Ausführung vorbereitet) werden. Bei nachfolgenden Anfragen mit geänderten Werten müssen nur noch die neuen Werte übermittelt werden. Dies spart sowohl Zeit bei der Kommunikation zwischen Client und Server als auch bei der Ausführung der Anfrage.
In Beispiel 10.3
erzeugen wir mit $mysqli->prepare() zunächst ein Objekt
der Klasse MySQLi_Stmt. Dieses repräsentiert die Anfrage
INSERT INTO tabelle (spalte) VALUES(?). Im Anschluss
binden wir mit der Methode bind_param() die PHP-Variable
$string an den Platzhalter der Anfrage. Ein Aufrufen der
Methode execute() führt die vorbereitete Anfrage mit dem
jeweils aktuellen Wert der PHP-Variablen $string als Wert
für ? auf.
Beispiel 10.3: PHP-Variablen an die Platzhalter einer Anfrage binden
<?php
$mysqli = new MySQLi('localhost', 'root', '', 'test');
$stmt = $mysqli->prepare(
'INSERT INTO tabelle (spalte) VALUES(?)'
);
$stmt->bind_param('s', $string);
$string = 'foo';
$stmt->execute();
$string = 'bar';
$stmt->execute();
?>
Der erste Parameter der Methode bind_param() enthält einen
String, in dem jedes Zeichen für den Typ einer gebundenen Variablen
steht. Nach diesem ersten Parameter folgen die PHP-Variablen, die an
die Anfrage gebunden werden sollen, in der entsprechenden
Reihenfolge.
Tabelle 10.2
zeigt die möglichen Typen und ihre Zeichen.
Tabelle 10.2. Die verfügbaren Typen für gebundene Parameter
| Typ | Beschreibung |
|---|---|
i | Variable ist eine Integerzahl. |
d | Variable ist eine Gleitpunktzahl. |
s | Variable ist ein String. |
b | Variable ist ein BLOB. Dieser wird in mehreren Paketen an den Datenbankserver gesendet. |
Mit der Methode bind_result() der Klasse MySQLi_Stmt
können die Spalten der Ergebniszeilen einer vorbereiteten Anfrage an
PHP-Variablen gebunden werden (siehe
Beispiel 10.4).
Hierbei entfällt die (bei Ergebniszeilen mit vielen Spalten teure)
Erzeugung eines Arrays für jede Ergebniszeile.
Beispiel 10.4: Die Spalten der Ergebniszeilen an PHP-Variablen binden
<?php
$mysqli = new MySQLi('localhost', 'root', '', 'test');
$stmt = $mysqli->prepare('SELECT spalte FROM tabelle');
$stmt->execute();
$stmt->bind_result($spalte);
while ($stmt->fetch()) {
print $spalte . "\n";
}
?>foo bar
Innerhalb der while-Schleife in
Beispiel 10.4
enthält die PHP-Variable $spalte stets den Inhalt der Spalte
spalte der aktuellen Ergebniszeile der Anfrage.