2013-02-16 8 views
12

Aktualizuję mój kod PHP z mysql do mysqli, ale nie mogę znaleźć odpowiedzi na to pytanie: Czy zapytania aktualizacji mysqli zwracają wynik?Czy żądania aktualizacji mysqli powinny zwracać wynik?

z MySQL, mogę zrobić

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

i $ wynik będzie prawdą, mimo że zapytanie nie zwraca żadnych wierszy.

Teraz jednak w kodzie mysqli, mam coś takiego (error-handling usunięte dla jasności):

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

i $ wynik jest fałszywy.

Dla rekordu kwerenda jest ważna (zignoruj ​​wszystkie literówki, które mogłem dokonać, transkrybując ją do stackoverflow), a pole 1 zostało poprawnie zaktualizowane w bazie danych zgodnie z oczekiwaniami. Ponadto get_result() działa dobrze dla wybranych zapytań, więc nie jest to kwestia, że ​​get_result() nie jest dostępny.

Po prostu chcę wiedzieć, czy to oczekiwane zachowanie się zmieniło, czy powinienem dalej próbować znaleźć jakiś błąd.

+0

OK ... komentarz zniknął, mówiąc mi, żebym sprawdził dokumentację, która rzeczywiście stwierdza, że ​​get_result "zwraca zestaw wyników lub FALSE w przypadku niepowodzenia." Czytałem to wcześniej, zanim zadałem moje pytanie, i myślę, że jestem ciekawy, czy dokumentacja jest dokładna. Po tym, jak $ stmt-> get_result() zwróciło fałsz, sprawdziłem $ stmt-> errno (który był 0) i $ stmt-> error (który był pusty) i wydawało się, że zapytanie zostało wykonane pomyślnie (ponieważ baza danych została zaktualizowana). Więc gdzie jest ten błąd? – Swiftheart

Odpowiedz

11

przygotowana instrukcja jest wykonywana z

$stmt->execute(); 

I execute() Zwraca TRUE w przypadku powodzenia, FALSE w przypadku porażki.

Ponieważ UPDATE, DELETE, INSERT nie daje żadnego zestawu wyników, nie ma potrzeby korzystania z get_result(). Jeśli potrzebujesz znać całkowitą liczbę dotkniętych wierszy, możesz to zrobić, używając funkcji mysqli_stmt_affected_rows().

Dlatego kod może wyglądać następująco

$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

Tak ... Mam tam linię $ stmt-> execute() w moim próbnym kodzie, a w moim rzeczywistym kodzie sprawdzam wartość zwracaną. Zwraca true, więc jest w porządku. Jestem tylko ciekawy, czy _ $ stmt-> get_result() _ powinien zwrócić true. – Swiftheart

+0

Zobacz zaktualizowaną odpowiedź. Nie musisz używać 'get_result()', jeśli wykonujesz zapytania 'UPDATE',' DELETE', 'INSERT', ponieważ nie tworzą żadnego zestawu wyników. – peterm

+0

Świetnie, dzięki. Podejrzewałem tyle, ale chciałem jakiegoś zewnętrznego potwierdzenia. – Swiftheart

3

dla zapytań SELECT nie mają „zestaw wyników”, tak get_result jest bez znaczenia dla nich. Jeśli chcesz się dowiedzieć, czy zapytanie modyfikacji (UPDATE, INSERT lub DELETE), użyj $stmt->affected_rows. To będzie 0 lub niezerowe, w zależności od tego, czy zapytanie zrobiło cokolwiek.