との違いを発見したばかりで、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であることに注意してください。
のPHPマニュアルは次のようにmysqli::$affected_rows
述べています。
-1は、クエリがエラーを返したことを示します
クエリは期待どおりにレコードを更新し、エラーや警告を返しませんでした。しかし、これはエラーがあったことを意味します。これがバグかどうかはわかりませんが、私が期待したものではありませんでした。どちらを使用する場合でも、明らかに最も安全な方法は、executeステートメントの直後にチェックすることです。