2013-02-16 11 views
12

Ich aktualisiere meinen PHP-Code von mysql zu mysqli, aber ich kann nicht die Antwort auf diese Frage zu finden scheinen: Liefert mysqli update Abfragen ein Ergebnis?Sollte mysqli update Abfragen ein Ergebnis zurückgeben?

Mit mysql, könnte ich tun

$result = mysql_query("UPDATE `data` SET `field1` = 1 WHERE `key` = '$mykey'); 

und $ result selbst träfe wenn die Abfrage keine Zeilen zurück.

Nun aber im Mysqli Code, ich habe so etwas wie dies (Fehlerbehandlung aus Gründen der Klarheit entfernt):

$stmt = $mysqli->prepare("UPDATE `data` SET `field1` = 1 WHERE `key` = (?)") 
$stmt->bind_param("s", $mykey); 
$stmt->execute(); 
$result = $stmt->get_result(); 

und $ Ergebnis ist falsch.

Für den Datensatz ist die Abfrage gültig (ignorieren Sie alle Tippfehler, die ich gemacht habe, um es in stackoverflow zu transkribieren) und Feld1 wird korrekt in der Datenbank wie erwartet aktualisiert. Get_result() funktioniert auch gut für Select-Abfragen, es geht also nicht darum, dass get_result() nicht verfügbar ist.

Im Grunde möchte ich nur wissen, ob dieses geänderte Verhalten erwartet wird oder ob ich weiterhin versuchen sollte, irgendwo einen Fehler zu finden.

+0

Okay ... ein Kommentar scheint verschwunden zu sein, mir die Dokumentation zu überprüfen, die tatsächlich besagt, dass get_result "ein Resultset oder FALSE bei Fehler zurückgibt." Ich habe das schon gelesen, bevor ich meine Frage gestellt habe, und ich denke, ich bin nur neugierig, ob die Dokumentation korrekt ist. Nachdem $ stmt-> get_result() false zurückgegeben hat, überprüfte ich $ stmt-> errno (was 0 war) und $ stmt-> error (was leer war) und die Abfrage schien erfolgreich ausgeführt zu werden (seit die Datenbank aktualisiert wurde). Wo tritt dieser Fehler auf? – Swiftheart

Antwort

11

vorbereitete Anweisung ausgeführt mit

$stmt->execute(); 

Und execute() kehrt bei Erfolg TRUE FALSE.

Da UPDATE, DELETE, INSERT keine Ergebnismenge ergeben, müssen Sie get_result() nicht verwenden. Wenn Sie die Gesamtzahl der betroffenen Zeilen kennen müssen, können Sie dies mit der Funktiontun.

Daher Code könnte wie folgt aussehen

$stmt = $mysqli->prepare("UPDATE `data` SET `field1` = 1 WHERE `key` = (?)") 
$stmt->bind_param("s", $mykey); 
$stmt->execute(); 
//You can get the number of rows affected by your query 
$nrows = $stmt->affected_rows; 
if (!$nrows) { 
    //Nothing has been updated 
} 
+0

Ja ... Ich habe die Zeile $ stmt-> execute() in meinem Beispielcode da oben, und in meinem tatsächlichen Code überprüfe ich den Rückgabewert. Es ist wahr, also ist das in Ordnung. Ich bin nur neugierig, ob _ $ stmt-> get_result() _ sollte True zurückgeben. – Swiftheart

+0

Siehe aktualisierte Antwort. Sie müssen 'get_result()' nicht verwenden, wenn Sie 'UPDATE'-,' DELETE'-, 'INSERT'-Abfragen ausführen, da sie keine Ergebnismenge erzeugen. – peterm

+0

Großartig, danke. Ich vermutete so viel, aber ich wollte eine Bestätigung von außen. – Swiftheart

3

Nicht-SELECT-Abfragen haben keinen „Ergebnismenge“, so get_result für sie bedeutungslos ist. Wenn Sie wissen möchten, ob eine Änderungsabfrage (UPDATE, INSERT oder DELETE) lautet, verwenden Sie $stmt->affected_rows. Dies wird 0 oder ungleich Null sein, abhängig davon, ob die Abfrage irgendetwas getan hat.

Verwandte Themen