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:

  1. SQL-Anweisung vorbereiten
  2. Die gewünschten Felder an die SQL-Anweisung binden
  3. Die SQL-Anweisung ausführen
  4. 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);