我剛剛發現mysqli_stmt::$affected_rows
和mysqli::$affected_rows
之間的差異,我沒有想到。
我認爲mysqli::$affected_rows
可以在關閉語句後調用,因爲我期望它根據在連接上執行的最後一個查詢來報告。如果聲明結束,我不認爲這很重要。不過,它似乎有所作爲。
此代碼:
$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', "\n\n";
}
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";
產生這樣的輸出:
沒有警告
之前$ stmt-> close()方法
$ mysqli-> affected_rows是1
$ stmt-> affected_rows 1
$ mysqli-> affected_rows爲1
後$ stmt-> close()方法
$ mysqli-> affected_rows是-1
注意的終值是如何負1
爲mysqli::$affected_rows
PHP手冊說:
-1表示查詢換貨政...發現錯誤
查詢按預期更新了記錄,但未返回錯誤或警告。但這意味着有一個錯誤。我不確定這是否是一個錯誤,但它肯定不是我所期望的。無論你使用哪一種,顯然最安全的方法是在執行聲明之後立即檢查它。
啊,是的。相反,如果mysqli_stmt對象不是最後執行的語句,它們可能會不同。 – toxalot