Oczywiście, mysqli_stmt::$affected_rows
jest niedostępna, jeśli nie są używane gotowe instrukcje. Ale gdy przygotowane oświadczenia są używane, jaka jest różnica między mysqli::$affected_rows
i mysqli_stmt::$affected_rows
?
Mam takie samo pytanie w odniesieniu do mysqli::$insert_id
vs mysqli_stmt::$insert_id
.
Próbuję zdecydować, czy powinienem użyć jednego na korzyść drugiego.
Przeczytałem podręczniki PHP dla tych właściwości. Zrobiłem kilka testów (PHP 5.3.17) używając jednego wykonania i używając wielu wykonań. Nie widzę różnicy.
Zastanawiam się więc, czy w pewnych okolicznościach (lub w niektórych wersjach) istnieje pewna różnica. Jeśli są dokładnie takie same, dlaczego mają obie te cechy?
Odpowiedzi:
2 dla odpowiedzi № 1Zwraca całkowitą liczbę wierszy zmienionych, usuniętych lub wstawionych przez ostatnie wykonane oświadczenie
Pobiera liczbę dotkniętych wierszy w poprzedniej operacji MySQL
Tak więc, jeśli obiekt mysqli_stmt był ostatnim wykonanym poleceniem, oba zapytania powinny dawać ten sam wynik.
1 dla odpowiedzi nr 2
Myślę, że to jedyny powód do zatrzymania mysqli:$affected_rows
jest mysqli::query
i mysqli::multi_query
, ponieważ oboje nie używają przygotowanych oświadczeń, a jedynym powodem do zachowania mysqli_stmt:$affected_rows
to OOP: enkapsulacja informacji związanych z zapytaniem w obiekcie instrukcji.
1 dla odpowiedzi nr 3
Właśnie odkryłem różnicę między mysqli_stmt::$affected_rows
i mysqli::$affected_rows
czego się nie spodziewałem.
Zakładałem to mysqli::$affected_rows
może zostać wywołany po zamknięciu instrukcji, ponieważ oczekiwałem, że będzie raportował na podstawie ostatniego zapytania wykonanego na połączenie. Nie sądziłem, że ma to znaczenie, gdyby oświadczenie zostało zamknięte, ale wydaje się, że robi różnicę.
Ten kod:
$db_err_msg = "Database Error: Failed to update profile";
$sql = "UPDATE tblProfiles SET lngPhoneNumber = ? WHERE lngProfileId = ?";
$stmt = $mysqli->prepare($sql) or output_error($db_err_msg);
$phone = 5555555555;
$id = 10773;
$stmt->bind_param("ii", $phone, $id) or output_error($db_err_msg);
$stmt->execute() or output_error($db_err_msg);
if ($mysqli->warning_count) {
$warnings = $mysqli->get_warnings();
do {
trigger_error("Database Warning (" . $warnings->errno . "): "
. $warnings->message, E_USER_WARNING);
} while ( $warnings->next() );
}
else {
echo "no warnings", "nn";
}
echo "Before $stmt->close()", "n";
echo "$mysqli->affected_rows is ", $mysqli->affected_rows, "n";
echo "$stmt->affected_rows is ", $stmt->affected_rows, "n";
echo "$mysqli->affected_rows is ", $mysqli->affected_rows, "n";
$stmt->close();
echo "n", "After $stmt->close()", "n";
echo "$mysqli->affected_rows is ", $mysqli->affected_rows, "n";
produkuje to wyjście:
brak ostrzeżeń
Przed $ stmt-> close ()
$ mysqli-> affected_rows to 1
$ stmt-> affected_rows to 1
$ mysqli-> affected_rows to 1Po $ stmt-> close ()
$ mysqli-> affected_rows to -1
Zwróć uwagę, że końcowa wartość jest ujemna 1.
Podręcznik PHP dla mysqli::$affected_rows
mówi:
-1 oznacza, że zapytanie zwróciło błąd
Zapytanie zaktualizowało rekord zgodnie z oczekiwaniami i wykonaniemnie zwróci błędu lub ostrzeżenia. A to sugeruje, że był błąd. Nie jestem pewien, czy to błąd, czy nie, ale z pewnością nie było to, czego się spodziewałem, bez względu na to, którego z nich używasz, najbezpieczniej jest sprawdzić to zaraz po instrukcji execute.