Hauptmenü

Untermenü

Advanced MySQL - Zwischenspeicherung -Prepared Statements

1. Vorbereitete Anweisungen

So wird das zumindest im MySQL-Handbuch genannt. Egal, kommen wir nun zum Prinzip. Wie der Name schon sagt, werden hier SQL-Anfragen vorbereitet. Darin befinden sich Platzhalter, die später Variablen zugewiesen werden. Einfach gesagt, definiert man eine Abfrage und kann dann beliebig viele Operationen damit ausführen. Ach ja, diese Technik funktioniert sowohl bei MyISAM- als auch InnoDb-Tabellen.

2. Ein Beispiel

Nehmen wir mal wieder die Kontoführung einer Bank. Nur geht es diesmal ums Gehalt und nicht um die Miete. Also, die Tabelle sieht dann meinetwegen so aus.


+----+---------------+----------+-------+-------+
| id name          blz      ktonr kohle |
+----+---------------+----------+-------+-------+
|  Peter Kropff  12345678 |  1234 |  0.00 |
|  Eine arme Sau 12345678 |  5678 |  0.00 |
+----+---------------+----------+-------+-------+

Und jetzt nehmen wir einfach mal an, dass unsere Bank all seinen Kunden das Gehalt an einem bestimmten Tag überweist. Gut, man könnte hier auch mit zig INSERT-Anweisungen arbeiten, aber zum Sinn des Ganzen komme ich später.

3. Prepared Statement vorbereiten

Eine vorbereitete Anweisung wird mit PREPARE eingeleitet. Das test ist nur ein Referenzname, den wir für die spätere Ausführung benötigen. In der eigentlichen SQL-Anweisung gibt es zwei Fragezeichen. Die dienen hier als Platzhalter und werden später von den Werten ersetzt, die wir in Variablen definieren.


PREPARE test FROM 'UPDATE konto 
                   SET kohle = kohle + ? 
                   WHERE id = ?';

4. Variablen setzen

Das geschieht mit SET. Der Variablenname selber beginnt mit einem @. Keine Ahnung warum, das altbekannte $-Zeichen wäre nicht so irritierend. Aber egal. Die Reihenfolge ist bis hierhin völlig lattens. Ach ja, das mit den 5000€ Nettogehalt bei mir ist nur ein Wunschtraum.


SET @kohle_1 5000;
SET @id_1    1;
SET @kohle_2 1000;
SET @id_2    2;

5. Die Ausführung

Abgeschlossen wird das Ganze mit EXECUTE. Dabei wird für die Ausführung der Referenznamen aus PREPARE genommen, in diesem Fall also test. Und dann werden die Variablen mit USING zugewiesen. Wichtig hierbei ist die Reihenfolge. Man nimmt also zuerst die Kohle und dann die ID. Schaut euch dazu noch mal das Statement in PREPARE an.


EXECUTE test USING @kohle_1, @id_1;
EXECUTE test USING @kohle_2, @id_2;

6. Auswirkung

Die komplette SQL-Anweisung


PREPARE test FROM 'UPDATE konto 
                   SET kohle = kohle + ? 
                   WHERE id = ?';
SET @kohle_1 5000;
SET @id_1    1;
SET @kohle_2 1000;
SET @id_2    2;
EXECUTE test USING @kohle_1, @id_1;
EXECUTE test USING @kohle_2, @id_2;

ist nahezu identisch mit


UPDATE 
  konto 
SET 
  kohle kohle 5000 
WHERE id 1;

UPDATE 
  konto 
SET 
  kohle kohle 1000 
WHERE id 2;


Und was soll das jetzt?

Gute Frage. Im Moment sieht das nicht so prickelnd aus. Denn Prepared Statements kommen erst richtig zur Geltung, wenn es um die Validierung von Eingaben geht. Denn in Kombination mit einer entsprechenden Sprache (zum Beispiel PHP) kann man damit wunderbar SQL-Injections verhindern. Darauf gehe ich aber erst in einem geplanten Tutorial ein. Sorry, so lange müsst ihr euch gedulden.

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