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 |
+----+---------------+----------+-------+-------+
| 1 | Peter Kropff | 12345678 | 1234 | 0.00 |
| 2 | 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