Hugo Egon Balder: mysqli - SELECT Abfrage mit prepared Statements

Beitrag lesen

Hallo Forum,

immer, wenn ich denke, ich habe zumindest einen Teil der Arbeit mit Datenbanken verstanden, komme ich danach drauf, dass ich offensichtlich _überhaupt nichts_ kapiert habe. Es ist echt zum Heulen.

Mit php/mysqli möchte ich alle Datensätze ausgeben, in denen "Hans" der Name ist. Hier der Weg ohne prepared Statements:

$sql="SELECT `id`,`name`, `stadt` FROM `foo` WHERE `name`='Hans'";  
$result=$db->query($sql);  
while($line=$result->fetch_object())  
  {  
    echo"<p>".$line->id." - ".$line->name." - ".$line->stadt."</p>\n";  
  }

Das funktioniert einwandfrei. So, nun möchte ich die Ausgabe mit einem prepared Statement machen. Meine erste Überlegung war, hier einfach einen prepared Statement-Teil einzufügen. Das sah dann so aus:

$eingabe_name="Hans";  
$sql="SELECT `id`,`name`, `stadt` FROM `foo` WHERE `name`=?";  
$result=$db->prepare($sql);  
$result->bind_param('s',$eingabe_name);  
$result->execute();  
while($line=$result->fetch_object())  
  {  
    echo"<p>".$line->id." - ".$line->name." - ".$line->stadt."</p>\n";  
  }

Das endet in der Fehlermeldung "Fatal error: Call to undefined method mysqli_stmt::fetch_object() in ..." -betreffend die Zeile mit der while-Schleife. Da verstehe ich schon mal nicht, wieso es hier ein Problem gibt. Das prepared Statement betraf doch den Abfrage-Weg _zur_ DB. Das Ergebnis, also die Ausgabe der DB, sind doch einfach, wie im ersten Fall, die betreffenden Datensätze.

OK, nach dem Besuch von sicher mehr als 50 Seiten zu dem Thema und 10 Stunden vor dem PC, habe ich vor kurzem das erste Mal eine funktioiernede Lösung ohne Fehlermeldung zustandegebracht. Und ich habe keine Ahnung, wieso:

$eingabe_name="Hans";  
$sql="SELECT `id`,`name`, `stadt` FROM `foo` WHERE `name`=?";  
$result=$db->prepare($sql);  
$result->bind_param('s',$eingabe_name);  
$result->execute();  
$result->bind_result($id,$name,$stadt);  
while($result->fetch())  
  {  
    echo"<p>".$id." - ".$name." - ".$stadt."</p>\n";  
  }

Ich verstehe es einfach nicht. Wieso muss ich, nur weil die Übergabe des Suchparameters mit einem prepared Statement geschehen ist, plötzlich die betreffenden Datensätze mit "bind_result" behandeln und in Variablen überführen? Wieso funktioniert im ersten Fall eine Schleife mit "$line=$result->fetch_object()" - während im prepared Statement Fall plötzlich nur eine Schleife mit "$result->fetch()" funktioniert? Wieso plötzlich nicht mehr die Syntax "$line->id"?

Wie gesagt, ich verstehe nicht, wieso sich beim Code für die Ausgabe der betreffenden Datensätze plötzlich so viel ändert, nur weil die Suchbedingung nicht direkt im Query, sondern als prepared Statement eingefügt worden ist.

Ich bitte darum, dass mir jemand in verständlichen Worten, also nicht in Techniksprech, die Unterschiede zwischen den beiden Situationen erklärt und wieso das nicht so funktioniert, wie ich es laut 2. Beispiel ursprünglich gedacht hatte.

Mit bestem Dank im Voraus für jede Hilfe!

MfG

Hugo Egon Balder