Der entscheidende Faktor für mich ist, ob ich meine Abfragespalten mit aufrufe *
.
Verwenden bind_result()
wäre dafür besser:
// Use bind_result() with fetch()
$query1 = 'SELECT id, first_name, last_name, username FROM table WHERE id = ?';
Verwenden get_result()
wäre dafür besser:
// Use get_result() with fetch_assoc()
$query2 = 'SELECT * FROM table WHERE id = ?';
Beispiel 1 zur $query1
Verwendungbind_result()
$query1 = 'SELECT id, first_name, last_name, username FROM table WHERE id = ?';
$id = 5;
if($stmt = $mysqli->prepare($query)){
/*
Binds variables to prepared statement
i corresponding variable has type integer
d corresponding variable has type double
s corresponding variable has type string
b corresponding variable is a blob and will be sent in packets
*/
$stmt->bind_param('i',$id);
/* execute query */
$stmt->execute();
/* Store the result (to get properties) */
$stmt->store_result();
/* Get the number of rows */
$num_of_rows = $stmt->num_rows;
/* Bind the result to variables */
$stmt->bind_result($id, $first_name, $last_name, $username);
while ($stmt->fetch()) {
echo 'ID: '.$id.'<br>';
echo 'First Name: '.$first_name.'<br>';
echo 'Last Name: '.$last_name.'<br>';
echo 'Username: '.$username.'<br><br>';
}
/* free results */
$stmt->free_result();
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
Beispiel 2 zur $query2
Verwendungget_result()
$query2 = 'SELECT * FROM table WHERE id = ?';
$id = 5;
if($stmt = $mysqli->prepare($query)){
/*
Binds variables to prepared statement
i corresponding variable has type integer
d corresponding variable has type double
s corresponding variable has type string
b corresponding variable is a blob and will be sent in packets
*/
$stmt->bind_param('i',$id);
/* execute query */
$stmt->execute();
/* Get the result */
$result = $stmt->get_result();
/* Get the number of rows */
$num_of_rows = $result->num_rows;
while ($row = $result->fetch_assoc()) {
echo 'ID: '.$row['id'].'<br>';
echo 'First Name: '.$row['first_name'].'<br>';
echo 'Last Name: '.$row['last_name'].'<br>';
echo 'Username: '.$row['username'].'<br><br>';
}
/* free results */
$stmt->free_result();
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
Wie Sie sehen, können Sie nicht bind_result
mit verwenden *
. Funktioniert jedoch get_result
für beide, bind_result
ist jedoch einfacher und nimmt einen Teil des Chaos mit $row['name']
.
bind_result ()
Vorteile:
- Einfacher
- Sie müssen sich nicht damit anlegen
$row['name']
- Verwendet
fetch()
Nachteile:
- Funktioniert nicht mit SQL-Abfragen, die verwendet werden
*
get_result ()
Vorteile:
- Funktioniert mit allen SQL-Anweisungen
- Verwendet
fetch_assoc()
Nachteile:
- Muss mit Array-Variablen herumspielen
$row[]
- Nicht so ordentlich
- benötigt nativen MySQL-Treiber ( mysqlnd )
$row[]
. Vielen Dank für die ausführliche Erklärung! Eine Warnung; laut Handbuch ist get_result () nur mit mysqlnd verfügbar.Beispiele finden Sie auf den jeweiligen Handbuchseiten.
Während Vor- und Nachteile ganz einfach sind:
Wenn Sie eine der beiden Funktionen direkt im Anwendungscode verwenden möchten, ist diese Idee falsch. Solange Sie sie in eine Methode eingekapselt haben, um Ihre Daten aus der Abfrage zurückzugeben, spielt es keine Rolle, welche Sie verwenden, außer dass Sie zehnmal mehr Code benötigen, um bind_result zu implementieren.
quelle
Der Hauptunterschied, den ich bemerkt habe, besteht darin, dass
bind_result()
Sie einen Fehler erhalten2014
, wenn Sie versuchen, verschachtelte $ stmt in andere $ stmt zu codieren , die abgerufen werden (ohnemysqli::store_result()
):Beispiel:
Funktion, die im Hauptcode verwendet wird.
Haupt code.
quelle
bind_result
richtig$stmt->store_result()
es verwenden, können Sie in$stmt
anderen verschachtelt tun$stmt
mysqli_stmt::bind_result
auf PHP.net sagt mir nichts über meinen Fehler ... Oder ist es eine gute Praxis, sie zu verwenden$stmt->store_result()
?mysql_store_result ()
eine große Ergebnismenge gesendet wird, kann dies zu einem Problem werden, oder irre ich mich? Ja, für dieses Beispiel ist es vielleicht nicht so wichtig ... Trotzdem, danke, dass du mich korrigiert hast :)get_result () ist jetzt nur in PHP verfügbar, indem der native MySQL-Treiber (mysqlnd) installiert wird. In einigen Umgebungen ist es möglicherweise nicht möglich oder wünschenswert, mysqlnd zu installieren.
Trotzdem können Sie mysqli weiterhin verwenden, um 'select *'-Abfragen durchzuführen und die Ergebnisse mit den Feldnamen abzurufen - obwohl dies etwas komplizierter ist als die Verwendung von get_result () und die Verwendung der Funktion call_user_func_array () von php umfasst. Siehe Beispiel unter Verwendung von bind_result () anstelle von get_result () in PHP, das eine einfache 'select *'-Abfrage ausführt und die Ergebnisse (mit den Spaltennamen) in eine HTML-Tabelle ausgibt.
quelle
Ich denke, Beispiel 2 wird nur so funktionieren, weil store_result und get_result beide die Informationen aus der Tabelle erhalten.
Also entfernen
Und ändern Sie die Reihenfolge ein wenig. Dies ist das Endergebnis:
quelle