phpのPDOを使ってDBを更新しているプログラムがあり、errorInfo()を使ってエラー情報を取得したいと思っています。
※エラー発生時にexceptionを発生する設定にすれば簡単に行くのは知っていますが、
諸事情によりerrorInfo()を使った方法でしか実現したいです。
<質問1>
エラーコードを取得するために、PDO::errorInfo()を使う予定ですが、
erroInfo()による取得できた配列の2番目に「ドライバ固有のエラーコード」を取れるようです。
http://php.net/manual/ja/pdo.errorinfo.php
しかし、どんだけWebを探しても、「ドライバ固有のエラーコード」の一覧を見つけられません。
DBはPostgresです。
ご存知のかた、URLを教えていただけないですか。
★追記
相変わらずわからないです。正直、「ドライバ固有のエラーメッセージ」が出れば問題ないと思うので、よしとします。
もし、分かる人がいれば教えてください。
<質問2>
また、キー重複になるようなInsert文を作成し、execute実行後にerrorInfo()を動かしてみましたが、
何故か「SQLSTATE エラーコード」が正常(00000)で帰ってきており、
「ドライバ固有のエラーメッセージ」にはキー重複に関するメッセージが帰ってきました。
なぜ、00000が帰ってきたのでしょうか?
PDOStatement::errorInfo()を使えば、正しい「SQLSTATE エラーコード」を取得できるのは確認していますが、http://php.net/manual/ja/pdo.errorinfo.phpを見てもPDO::errorInfo()のだめな理由がよくわかりません。
★追記
おそらくですが、わかりました。
PDO::errorInfo()は、「データベースハンドラにおける直近の操作に関連する SQLSTATE を取得する」ようです。ですので、PDOのnew したオブジェクトのメソッド(prepare、rollback、commitなど)を実行したときに発生したエラーのみ取得できると思われます。
PDOStatement::errorInfo()はprepareStatementオブジェクトのメソッドを実行(executeなど)を実行したときに発生したエラーのみ取得できるエラーのようですね。
<質問3>
prepare()でエラーが発生する可能性がわかったので、prepare()の実行結果に問題があった場合(返り値がfalse)、PDO::errorInfo()を使って情報を取得しようとしています。
http://php.net/manual/ja/pdo.errorinfo.php にもある通り、エラー情報を取得できる記述がありますが、<質問2>に書いたとおり問題が発生したのにも関わらず「SQLSTATE エラーコード」が正常(00000)となることを懸念しています。
ちゃんと「SQLSTATE エラーコード」を取得できるのでしょうか。
★追記
よくわからないですが、対応方法は決めました。
prepare()でDBにアクセスするかどうかは、ネットを見ると意見が別れているようです。なんで???
まあデータベースハンドラのメソッドなんでDBにアクセスする可能性があるので、一応PDO::errorInfo()を組み込むことにします。
★追記
prepare()で変な構文だったり存在しないテーブルを指定しても、prepareの返り値がfalseになることはありませんでした。
環境の問題で、ネットワークを遮断するとどうなるかとか確認できませんでしたが、
まあおそらくDBにはアクセスしていないものと思うことにしました。
正直、phpの公式サイトに書いてるサンプルコードは役に立ちませんね。DBのドライバによるのかと思いますが、Postgresqlの場合再現できません。
質問が3つありますが、1つでもお答えいただければ助かります。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/24 07:56 編集
2017/10/24 09:10