SQL-Anweisungen vorbereiten, Werte „binden“ und SQL-Query ausführen
Jetzt wenden wir die Möglichkeit an, Daten an vorbereitete SQL-Anweisungen zu „binden“. Es wird eine SQL-Anweisung mit Platzhaltern geschaffen und die gewünschten Daten „übergeben“. Dadurch findet automatisch eine Bereinigung und Maskierung von kritischen Eingaben statt. Wir benötigen durch diese Vorgehensweise nicht mehr das Maskieren über real_escape_string
, wie im letzten Abschnitt beschrieben!
Unser Code wird dadurch auch wesentlich sauberer und übersichtlicher.
Erst durch das ausführen der SQL-Anweisung findet der Datenbankzugriff statt.
Wir haben also 4 Schritte:
- SQL-Anweisung vorbereiten
- Die gewünschten Felder an die SQL-Anweisung binden
- Die SQL-Anweisung ausführen
- die gewünschten Variablen für die Rückgabe an die SQL-Anweisung binden
Damit wir die beiden Beispiele besser auseinanderhalten können, machen wir das folgende Beispiel mit dem Feld „nachname“ und realisieren eine kleine Suchfunktion.
Die Eingaben werden kontrolliert, ob vorhanden und eventuelle Leerzeichen werden beseitigt.
if (isset($_GET['nachname'])) {
$nachname= trim($_GET['nachname']);
echo "<p>Gesucht wird nach: <b>". $nachname ."</b></p>";
}
Mit der bisherigen Kenntnis würde uns SQL-Anweisung wie folgt aussehen:
SELECT vorname, nachname FROM kontakte WHERE nachname='$nachname'
Über die neue Möglichkeit erstellen wir eine SQL-Anweisung (engl. prepare = vorbereiten)
SELECT vorname, nachname FROM kontakte WHERE nachname = ?
Und das Ganz für PHP:
$suche = $db->prepare("SELECT vorname, nachname FROM kontakte
WHERE nachname = ?");
Im zweiten Schritt wird die Variable an die vorbereitete Anweisung gebunden:
$suche = $db->prepare("SELECT vorname, nachname FROM kontakte
WHERE nachname = ?");
$suche->bind_param('s', $nachname);
Und dritten Schritt erfolgt die Ausführung:
$suche = $db->prepare("SELECT vorname, nachname FROM kontakte
WHERE nachname = ?");
$suche->bind_param('s', $nachname);
$suche->execute();
Bisher bekommen wir noch nicht viel zurück – einfach einmal mit print_r($suche)
ausgeben lassen.
Wir müssen jetzt im letzten (4.) Schritt Variablen an Felder binden.
$suche = $db->prepare("SELECT vorname, nachname FROM kontakte
WHERE nachname = ?");
$suche->bind_param('s', $nachname);
$suche->execute();
$suche->bind_result($vorname, $nachname);
Wobei hier die Variablennamen keine Rolle spielen, die hier einfach in der Reihenfolge zugewiesen wird.
Es könnte genauso auch dastehen:
$suche->bind_result($rufname, $familienname);
Jetzt können wir mit den eingebundenen Variablen nutzen, sobald wir das Ergebnis über fetch
(engl. fetch = holen) abgeholt haben.
$suche = $db->prepare("SELECT vorname, nachname FROM kontakte
WHERE nachname = ?");
$suche->bind_param('s', $nachname);
$suche->execute();
$suche->bind_result($vorname, $nachname);
$suche->fetch();
echo $vorname;
Mit fetch
wird nur ein Datensatz abgeholt – liegen mehr vor, sollte man es in eine Schleife packen, die solange läuft, solange Daten vorhanden sind:
$suche = $db->prepare("SELECT vorname, nachname FROM kontakte
WHERE nachname = ?");
$suche->bind_param('s', $nachname);
$suche->execute();
$suche->bind_result($vorname, $nachname);
while ($suche->fetch()) {
echo "<li>";
echo $vorname .' '. $nachname;
}
Wollen wir jetzt sowohl das Feld Vornamen wie Nachname durchsuchen, erweitern wir unsere SQL-Anweisung. Allerdings sollen wir unsere Variabel, mit der wir suchen auch entsprechenden nennen – sprich „$suchbegriff“
$suche = $db->prepare("SELECT vorname, nachname FROM kontakte
WHERE nachname = ? OR vorname = ?");
$suche->bind_param('ss', $suchbegriff, $suchbegriff);
$suche->execute();
$suche->bind_result($vorname, $nachname);
while ($suche->fetch()) {
echo "<li>";
echo $vorname .' '. $nachname;
}
Und wenn wir jetzt noch Teilbereiche finden wollen „sprich wie wollen in der Suche Beispielsweise Conner eingeben können und „O’Conner“ soll gefunden werden, dann hilft hier LIKE
und „%“
$suche_nach = "%{$suchbegriff}%";
$suche = $db->prepare("SELECT vorname, nachname FROM kontakte
WHERE nachname LIKE ? OR vorname LIKE ?");
$suche->bind_param('ss', $suche_nach, $suche_nach);
$suche->execute();
$suche->bind_result($vorname, $nachname);
while ($suche->fetch()) {
echo "<li>";
echo $vorname .' '. $nachname;
}
Ist das Feld in der Datenbank kein STRING-Feld sondern ein Integer wie bei dem ‚id’-Feld, dann muss die bin-Anweisung anstelle von s ein i bekommen. Im Folgenden suchen wir den Datensatz mit der id=2
$suche = $db->prepare("SELECT vorname, nachname FROM kontakte
WHERE id = ? ");
$suche->bind_param('i', $suche_nach);
$suche->execute();
$suche->bind_result($vorname, $nachname);
while ($suche->fetch()) {
echo "<li>";
echo $vorname .' '. $nachname;
}
Mischformen sind hier genauso möglich
$suche->bind_param('si', $vorname, $id);
Wenn Sie einen Fehler finden, bitte mitteilen (egal ob Schreibfehler oder inhaltlicher Fehler).
Mit Maus fehlerhafte Stelle markieren und übernehmen mit folgendem Button: