Beispiel für die Verwendung von bind_result vs get_result

81

Ich würde gerne ein Beispiel sehen, wie man mit bind_resultvs. aufruft get_resultund was der Zweck wäre, eins übereinander zu verwenden.

Auch die Vor- und Nachteile der Verwendung.

Was ist die Einschränkung von entweder und gibt es einen Unterschied.

Arian Faurtosh
quelle

Antworten:

197

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 $query1Verwendungbind_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 $query2Verwendungget_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_resultmit verwenden *. Funktioniert jedoch get_resultfür beide, bind_resultist 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 )
Arian Faurtosh
quelle
8
OMG, ich wünschte, ich hätte diese Fragen und Antworten gefunden, bevor ich alles an a gebunden habe $row[]. Vielen Dank für die ausführliche Erklärung! Eine Warnung; laut Handbuch ist get_result () nur mit mysqlnd verfügbar.
Sablefoste
2
@SableFoste Richtig! Und das bedeutet ... Sie müssen sich mit Konfigurationen anlegen ... also ... verwenden Sie bind_result.
Test
1
Für alle, bei denen die Methode get_result () nicht funktioniert: stackoverflow.com/questions/8321096/…
Karl Adler
3
get_result () hat auch für das zweite Beispiel nicht funktioniert - es wurde immer wieder False und errno = 0 zurückgegeben (kein Fehler). Durch Entfernen des Aufrufs store_result () wurde das Problem behoben.
Winwaed
1
@ Black speichert die Eigenschaften der Abfrage ... wie Anzahl der zurückgegebenen Zeilen usw.
Arian Faurtosh
2

Beispiele finden Sie auf den jeweiligen Handbuchseiten.

Während Vor- und Nachteile ganz einfach sind:

  • get_result ist der einzig vernünftige Weg, um mit Ergebnissen umzugehen
  • Es ist jedoch nicht immer verfügbar und Ihr Code muss einen Fallback mit hässlichem bind_result haben.

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.

Ihr gesunder Menschenverstand
quelle
1
<b> Schwerwiegender Fehler </ b>: Aufruf der undefinierten Methode mysqli_stmt :: get_result () Der obige Code gibt einen solchen Fehler aus
Kissa Mia
1
Entschuldigung, aber ich finde bind_result () nicht hässlich ... Können Sie bitte erklären, wo die Hässlichkeit liegt?
Samuel Ramzan
1

Der Hauptunterschied, den ich bemerkt habe, besteht darin, dass bind_result()Sie einen Fehler erhalten 2014, wenn Sie versuchen, verschachtelte $ stmt in andere $ stmt zu codieren , die abgerufen werden (ohne mysqli::store_result()):

Vorbereitung fehlgeschlagen: (2014) Befehle nicht synchron; Sie können diesen Befehl jetzt nicht ausführen

Beispiel:

  • Funktion, die im Hauptcode verwendet wird.

    function GetUserName($id)
    {
        global $conn;
    
        $sql = "SELECT name FROM users WHERE id = ?";
    
        if ($stmt = $conn->prepare($sql)) {
    
            $stmt->bind_param('i', $id);
            $stmt->execute();
            $stmt->bind_result($name);
    
            while ($stmt->fetch()) {
                return $name;
            }
            $stmt->close();
        } else {
            echo "Prepare failed: (" . $conn->errno . ") " . $conn->error;
        }
    }
  • Haupt code.

    $sql = "SELECT from_id, to_id, content 
            FROM `direct_message` 
            WHERE `to_id` = ?";
    if ($stmt = $conn->prepare($sql)) {
    
        $stmt->bind_param('i', $myID);
    
        /* execute statement */
        $stmt->execute();
    
        /* bind result variables */
        $stmt->bind_result($from, $to, $text);
    
        /* fetch values */
        while ($stmt->fetch()) {
            echo "<li>";
                echo "<p>Message from: ".GetUserName($from)."</p>";
                echo "<p>Message content: ".$text."</p>";
            echo "</li>";
        }
    
        /* close statement */
        $stmt->close();
    } else {
        echo "Prepare failed: (" . $conn->errno . ") " . $conn->error;
    }
Norman Edance
quelle
Dies ist eigentlich nicht ganz richtig ... Sie verwenden nicht bind_resultrichtig
Arian Faurtosh
1
Wenn Sie $stmt->store_result()es verwenden, können Sie in $stmtanderen verschachtelt tun$stmt
Arian Faurtosh
@ArianFaurtosh, was mache ich falsch? Die Dokumentation über mysqli_stmt::bind_resultauf PHP.net sagt mir nichts über meinen Fehler ... Oder ist es eine gute Praxis, sie zu verwenden $stmt->store_result()?
Norman Edance
@ArianFaurtosh, ich dachte, wenn 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 :)
Norman Edance
1

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.

mti2935
quelle
0

Ich denke, Beispiel 2 wird nur so funktionieren, weil store_result und get_result beide die Informationen aus der Tabelle erhalten.

Also entfernen

/* Store the result (to get properties) */
$stmt->store_result();

Und ändern Sie die Reihenfolge ein wenig. Dies ist das Endergebnis:

$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();
Abkühlen
quelle