MySQLi Prepared Statements – SELECT Abfragen

Nachdem wir uns mit den Grundlagen von MySQLi beschäftigt haben, möchte ich hier ein wenig auf die Vorteile von MySQLi eingehen. Das Zauberwort heißt Prepared Statements.

Was ist ein Prepared Statement?

Darunter versteht man eine Anweisung für ein Datenbanksystem, die vorkompiliert wird. Das heißt, dem Datenbanksystem wird eine Anweisung übergeben, die nicht mit konkreten Daten gefüllt ist, sondern Platzhalter verwendet werden. Der Vorteil überwiegt in einer erhöhten Geschwindigkeit, wenn die eine Anfrage geparst wird und nur noch mit verschiedenen Parametern ausgeführt werden muss.
Bei komplexen Abfragen sollte eher darauf verzichtet werden, weil es das System sogar langsamer machen kann.
Ein weiterer Vorteil ist, das alle Eingaben nicht maskiert werden müssen, Stichwort SQL-Injections, denn das wird von dem System übernommen. Wie das alles funktioniert, werden wir uns nun ansehen.


Ich persönlich bevorzuge die objektorientierte Variante, doch der Vollständigkeit halber, werde ich auch die prozedurale Variante zeigen. Fangen wir gleich damit an. Die Verbindung zu einer Datenbank werde ich jetzt nicht noch einmal beschreiben, das kann man sich hier ansehen.

Prozedurale Prepared Statements

$vorname = "Sarah";
$stmt = mysqli_stmt_init($mysqli);
if(mysqli_stmt_prepare($stmt, 'SELECT vorname, nachname FROM benutzer WHERE vorname = ?'))
 {
  mysqli_stmt_bind_param($stmt, "s", $vorname);
  mysqli_stmt_execute($stmt);
  mysqli_stmt_bind_result($stmt, $vorname, $nachname);


  while(mysqli_stmt_fetch($stmt))
  {
   echo $vorname.' '.$nachname;
  }
 }
mysqli_close($mysqli);
//Ausgabe: Sarah Schmidt

Auf den ersten Blick kann man erkennen, dass die Funktionsbezeichnungen ziemlich lang sind. Das ist ein weiterer Grund, warum man objektorientiert arbeiten sollte. Mit mysqli_stmt_init initialisieren wir ein Statement, das ein Objekt zurück gibt, damit wir es in mysqli_stmt_prepare benutzen können.
In unserer SQL-Anweisung erkennt man direkt etwas ungewöhnliches. Denn anstatt einen Parameter anzugeben, wird ein Platzhalter verwendet, den das Fragezeichen darstellt. An diesen Platzhalter wird mit mysqli_stmt_bind_param ein Wert gebunden, den wir als String deklarieren. Dafür steht das s. Von diesen Typenbezeichnern gibt es noch mehr, dazu aber weiter unten.
In der nächsten Zeile wird unser Statement mit mysqli_stmt_execute() ausgeführt. Damit wir mit der Ausgabe weiter arbeiten können, müssen wir die Ausgabewerte an eine Variable binden, das mit mysqli_stmt_bind_result funktioniert.
Das lassen wir uns dann durch eine while-Schleife ausgeben.
Dann schließen wir die Datenbankverbindung wieder.

Objektorientierte Prepared Statements

$vorname = "Sarah";
$stmt = $mysqli->prepare('SELECT vorname, nachname FROM benutzer WHERE vorname = ?');
$stmt->bind_param("s", $vorname);
$stmt->execute();
$stmt->bind_result($vorname, $nachname);


while($stmt->fetch())
 {
  echo $vorname.' '.$nachname;
 }
$mysqli->close();
//Ausgabe: Sarah Schmidt

Es ist viel weniger Schreibaufwand von Nöten und wesentlich übersichtlicher. Jetzt zeige ich noch die verschiedenen Typen, die man bei einem Prepared Statement verwenden kann.

// String ist eine Zeichenkette
s = String
// Integer sind ganze Zahlen
i = Integer
// Double sind Fließkommazahlen
d = double
//(Binary Large Object) Binäre Datei
b = Blob

Jetzt erkennt man die Mächtigkeit von Prepared Statements. Ein Angreifer kann Slashes und Quots setzten wie er möchte und trotzdem wird alles als gewöhnlicher String oder als entsprechender Typ behandelt.

Impressum | 2014 © Wissen Lernen - Webpixelpromoter.com