/ / Jaka jest różnica między mysqli :: $ affected_rows i mysqli_stmt :: $ affected_rows? - php, mysqli

Jaka jest różnica między mysqli :: $ affected_rows i mysqli_stmt :: $ affected_rows? - php, mysqli

Oczywiście, mysqli_stmt::$affected_rows jest niedostępna, jeśli nie są używane gotowe instrukcje. Ale gdy przygotowane oświadczenia 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 № 1

mysqli_stmt::$affected_rows:

Zwraca całkowitą liczbę wierszy zmienionych, usuniętych lub wstawionych przez ostatnie wykonane oświadczenie

mysqli::$affected_rows:

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 1

Po $ 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.