Vorbereitete Anfragen verwenden

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

TypBeschreibung
iVariable ist eine Integerzahl.
dVariable ist eine Gleitpunktzahl.
sVariable ist ein String.
bVariable 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.