現在の位置: ホーム> 最新記事一覧> なぜあなたのPDO :: execが例外を投げていないのですか?たぶん私はこのステップを忘れました

なぜあなたのPDO :: execが例外を投げていないのですか?たぶん私はこのステップを忘れました

gitbox 2025-09-17

PDOエラー処理モード

PDOのデフォルトエラー処理モードはPDO :: errmode_silentです。つまり、エラーが発生した場合、PDOは積極的に例外を投げかけませんが、静かに処理します。つまり、SQLステートメントを実行するときにエラーが発生した場合、PDOは自動的に促されたり、例外をスローしたりしませんが、エラーステータスを手動で確認する必要があります。

エラーが発生したときに例外をキャッチしてデバッグできるようにしたい場合、これを行う正しい方法は、PDOのエラーモードをPDO :: errmode_exceptionに設定することです。これにより、 exec()または他のデータベース操作方法が実行されると、エラーが発生すると例外がスローされ、トライキャッチを介してキャッチして処理できます。

PDOエラー処理モードを設定する方法は?

PDOインスタンスを作成するときは、 Setattribute()メソッドを使用してエラー処理モードを設定できます。たとえば、次のコードは、例外処理を有効にする方法を示しています。

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-keyword">try</span></span><span> {
    </span><span><span class="hljs-comment">// 作成する PDO 例,エラーモードを例外に設定します</span></span><span>
    </span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=testdb'</span></span><span>, </span><span><span class="hljs-string">'username'</span></span><span>, </span><span><span class="hljs-string">'password'</span></span><span>);
    </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">setAttribute</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">ATTR_ERRMODE</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">ERRMODE_EXCEPTION</span></span><span>);

    </span><span><span class="hljs-comment">// a SQL 声明</span></span><span>
    </span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"UPDATE users SET name = 'John' WHERE id = 1"</span></span><span>;
    </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">exec</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (PDOException </span><span><span class="hljs-variable">$e</span></span><span>) {
    </span><span><span class="hljs-comment">// 例外をキャッチして処理します</span></span><span>
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'データベース操作に失敗しました: '</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

この例では、 pdo :: attr_errmodeをpdo :: errmode_exceptionに設定するため、 exec()が実行に失敗すると、pdoがpdoexceptionの例外をスローし、 Catchステートメントを介してエラーメッセージをキャッチできます。

デフォルトで例外がスローされないのはなぜですか?

PDOのデフォルトのエラー処理モードは、特にエラー処理が不要なシナリオでパフォーマンスを改善することです。これにより、不必要なオーバーヘッドが減少する可能性があります。たとえば、バッチ挿入操作を実行すると、開発者は各データが正常に挿入されるかどうかを気にしないかもしれませんが、全体的な実行に問題があるかどうかにのみ注意してください。例外をスローしないと、コードの複雑さを減らすことができます。

ただし、データベース操作でより厳格なエラーチェックを実行する必要がある場合、例外モードをオンにすることが重要になります。それ以外の場合、SQLステートメントが間違って書かれている場合でも、PDOは何か間違ったものを促しません。

PDO :: execおよび取引

Exec()は、トランザクションの外側でのみエラー処理を実行することに注意する必要があります。トランザクション内でexec()を使用し、例外が正しくキャッチされない場合、トランザクションのコミットまたはロールバックは自動的に処理されません。トランザクションをより適切に制御するには、 begintransaction()commive()と組み合わせて使用​​する必要があります。

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-keyword">try</span></span><span> {
    </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">beginTransaction</span></span><span>();

    </span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"UPDATE users SET name = 'Jane' WHERE id = 1"</span></span><span>;
    </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">exec</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);

    </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">commit</span></span><span>(); </span><span><span class="hljs-comment">// トランザクションを送信します</span></span><span>
} </span><span><span class="hljs-keyword">catch</span></span><span> (PDOException </span><span><span class="hljs-variable">$e</span></span><span>) {
    </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">rollBack</span></span><span>(); </span><span><span class="hljs-comment">// ロールバックトランザクション</span></span><span>
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'トランザクションは失敗しました: '</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

これにより、エラーが発生すると、トランザクションがロールバックされ、データベース状態の一貫性が保証されます。

  • 関連タグ:

    PDO