Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Die Anzahl der Zeilen kann nicht abgerufen und abgerufen werden, wenn die vorbereitete MySQLi-Anweisung verwendet wird

Wenn Sie mysqli_stmt::$num_rows verwenden möchten (das heißt, überprüfen Sie die Anzahl der Zeilen in der vorbereiteten Anweisung), müssen Sie $stmt->store_result() verwenden nach dem Ausführen der vorbereiteten Anweisung, bevor Sie die Anzahl der Zeilen überprüfen können. Das bedeutet, dass das Ergebnis im Speicher gespeichert wird, bevor wir prüfen, wie viele Zeilen zurückgegeben wurden.

$stmt = $conn->prepare($sql);
$stmt->bind_param('ss',$log_username,$log_username);
$stmt->execute();
$stmt->store_result(); // Need to store the result into memory first
if ($stmt->num_rows) {
    // ...

Wenn Sie jedoch mysqli_result::$num_rows verwenden möchten (auf dem MySQLi-Ergebnis, das Sie aus dem Anweisungsergebnis konvertieren), müssen Sie dies tun, nachdem Sie $result = $stmt->get_result(); ausgeführt haben , und verwenden Sie $result->num_rows; , wie unten gezeigt.

$stmt = $conn->prepare($sql);
$stmt->bind_param('ss',$log_username,$log_username);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows) {
    while ($row = $result->fetch_assoc()) {
    // ....

Am Ende sollten beide das Gleiche tun – eine Reihe von Zeilen bereitstellen, die von der ursprünglich vorbereiteten Abfrage zurückgegeben wurden.

Hinweis
Es ist wichtig zu beachten, dass Sie store_result() nicht verwenden können und get_result() auf die gleiche Aussage. Das bedeutet, dass Sie im ersten Beispiel nicht in ein mysqli-result-Objekt konvertieren können (mithilfe von get_result()). , wodurch Sie den Standard fetch_assoc() verwenden können Methode). Als store_result() speichert das Ergebnis im Speicher, es gibt nichts für get_result() umwandeln und umgekehrt.

Das bedeutet, wenn Sie store_result() verwenden , müssen Sie die Anweisung abrufen, mysqli_stmt::fetch() und binden Sie die Ergebnisse durch mysqli_stmt::bind_result() . Wenn Sie get_result() verwenden , sollten Sie die Anzahl der Zeilen des resultierenden MySQLi-Ergebnisobjekts überprüfen (wie im zweiten Beispiel gezeigt).

Sie sollten Ihren Code daher so aufbauen, dass Sie nur einen davon verwenden müssen.

Allerdings mit affected_rows wie in den Kommentaren vorgeschlagen, ist nicht das richtige Werkzeug für den Job - gemäß dem Handbuch zu mysqli_stmt::$affected_rows (Dasselbe gilt für eine normale Abfrage, mysqli::$affected_rows ):