0

厳密モードをオンにして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 の値は更新されません。

この場合の成功の定義は次のとおりです。

  • レコードを挿入したか、レコードを更新したか、変更が行われなかった場合は何もしませんでした
  • 「静かにデータを壊す」ことはありませんでした

多くの初心者プログラマーは、戻り値や警告をチェックすることなく、クエリが成功したと思い込むという間違いを犯します。彼らのコードは正常に機能します...通常の条件下で。

私の質問は次のとおりです。 「厳密モードをオンにしてエラーチェックを行った私のコードを考えると、クエリが成功したと仮定しても安全ですか?それは正しい仮定ですか?それとも間違った仮定ですか?警告もチェックする必要がありますか?冗長ですか?」

4

3 に答える 3

1

関数の値を確認する必要がありmysqli::info()ます。

データを挿入すると、文字列は次のようになります。

Records: 1 Duplicates: 0 Warnings: 0

もう一つの機能はmysqli::affected_rows. 最後の挿入/更新/削除クエリで影響を受けた行の数を返します。

于 2012-12-13T18:32:10.293 に答える
0

それはおそらく安全な仮定だと思いますが、申し訳ありませんよりも安全だと思いました。executeステートメントの直後のcloseステートメントの前に次のコードを追加しました。

//I think this is probably redundant, but just in case
if ($mysqli->warning_count) {
    $warnings = $stmt->get_warnings();
    do {
        trigger_error('Database Warning (' . $warnings->errno . '): '
            . $warnings->message, E_USER_WARNING);
    } while ( $warnings->next() );
}

なぜそうしたのかを思い出せるようにコメントを追加しました。

于 2012-12-16T14:26:01.393 に答える
0

はい、安全に想定できますが、再確認のために、挿入された最新のレコードの ID をフェッチします。ID がある場合は、それが挿入されました

于 2012-12-13T18:28:27.623 に答える