厳密モードをオンにしてMySQLを使用しています。HTMLフォームを介してユーザーから提供されたデータを挿入しています。私はすでにすべての検証を行っており、これが最後のステップです。
これが私のPHPコードからの抜粋です:
$sql = 'SET sql_mode = TRADITIONAL'; //last chance data validation
$mysqli->query($sql) or output_error('Database Error: Failed to set SQL mode');
$db_err_msg = 'Database Error: Failed to update profile summary';
$sql = "INSERT INTO {$tables['text']} (lngProfileId, memProfileText) VALUES(?, ?)
ON DUPLICATE KEY UPDATE memProfileText = VALUES(memProfileText)";
$stmt = $mysqli->prepare($sql) or output_error($db_err_msg);
$stmt->bind_param('is', $profile_id, $_POST['memProfileText'])
or output_error($db_err_msg);
$stmt->execute() or output_error($db_err_msg);
$stmt->close();
//if code reaches this point, can it assume insert/update succeeded?
注: output_error
致命的なエラーのエラーハンドラーです。戻りません。終了します。
警告を確認する必要がありますか? または、挿入/更新が成功したと安全に想定できますか? 厳密モードがオンになっている場合でも、エラーではなく警告が発生する可能性があるシナリオはありますか?
編集:私は致命的なエラーと見なされるべきものについてのみ心配しています。挿入ではなく更新された場合、それは私には関係ありません。これはエラーではありません。
また、last_insert_id
このaffected_rows
場合は無意味です。ユーザーが変更を加えていない場合、影響を受ける行は 0 になり、last_insert_id の値は更新されません。
この場合の成功の定義は次のとおりです。
- レコードを挿入したか、レコードを更新したか、変更が行われなかった場合は何もしませんでした
- 「静かにデータを壊す」ことはありませんでした
多くの初心者プログラマーは、戻り値や警告をチェックすることなく、クエリが成功したと思い込むという間違いを犯します。彼らのコードは正常に機能します...通常の条件下で。
私の質問は次のとおりです。 「厳密モードをオンにしてエラーチェックを行った私のコードを考えると、クエリが成功したと仮定しても安全ですか?それは正しい仮定ですか?それとも間違った仮定ですか?警告もチェックする必要がありますか?冗長ですか?」