Hauptmenü

Untermenü

MySQLi - Methoden - MySQLi_STMT

1. Prepared Statements

Wie ich eingangs schon sagte, kümmert sich die MySQLi_STMT-Klasse ausschließlich um den oben genannten Mechanismus. Das alles läuft nach folgendem Schema ab.

Wer sich jetzt fragt "'HÄ?", der sollte zuerst mal hier aufkreuzen und sich das notwendige Basiswissen verschaffen.

2. Vorbereitung

Dazu benötigt man ein SQL-Statement, gegebenenfalls mit so genannten Wildcards. Üblich ist das Fragezeichen. Das Statement selber wird dann mit prepare eingeleitet.


// Objektorientiert
$mysqli = new mysqli('host''user''pw''db');
$query  'INSERT INTO bla (blubb, blubber) VALUES (?, ?)';
$stmt   $mysqli -> prepare ($query);

// Prozedural
$mysqli mysqli_connect('host''user''pw''db');
$query  'INSERT INTO bla (blubb, blubber) VALUES (?, ?)';
$stmt   mysqli_prepare ($mysqli$query);

3. Parameter setzen

So, bei obiger Anweisung wollen wir zwei Werte in eine Tabelle schreiben. Und da müssen wir den zwei Fragezeichen Werte zuweisen. Das geschieht mit der Methode bind_param.


// Objektorientiert
$stmt -> bind_param('is'$blubb$blubber);

// Prozedural
mysqli_stmt_bind_param ($stmt'is',$blubb$blubber);

Achtet um Himmels Willen auf die Reihenfolge. Erster Wert für das erste Fragenzeichen, zweiter Wert für das zweite Fragezeichen und so weiter.

Mui importante!

Bei bind_param darf man definitiv nicht mit hart codierten Werten arbeiten! Ein bind_param('is', 1, 'bla') haut euch also eine Fehlermeldung à la Fatal error: Only variables can be passed by reference in ... um die Ohren.

Warum?

Denkt mal scharf nach. Ein Prepared Statement ist eine vorbereitete Abfrage, die dann später mit unterschiedlichen Werten gefüttert wird. Wen man also in so einem Fall mit festen Angaben arbeitet, so ist das völlig sinnfrei und wird mit einem Fatal error bestraft.

4. Die Sache mit dem 'is'

Sieht ein bißchen komisch aus (genau so wie bisschen), ist aber ein verdammt gutes Feature. Denn an der Stelle definiert man den Typ der einzelnen Werte. Es gibt dabei vier Möglichkeiten.

Und was soll das?

Denkt einfach mal an das Thema SQL-Injections. Na, dämmert es? Genau, dies ist ein Sicherheitsmechanismus, der den Typ der übergebenen Werte prüft. Und wenn da was nicht stimmt, dann wird nichts aus der Ausführung.

Ein Hinweis

Das mit den Werten darf man nicht wörtlich nehmen. In ein VARCHAR-Feld kann man getrost Zahlen schreiben. Das gilt auch für FLOAT oder DATE. Was dabei am Ende herauskommt, ist eine andere Sache, aber dafür gibt es ja noch den Strict-Modus von MySQL.

5. Ausführung


// Objektorientiert
$stmt -> execute();

// Prozedural
mysqli_stmt_execute($stmt);

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