こんにちは!
ナビゲータのEVEです。
今日も、プログラム修正で、特定の箇所で多くの時間が取られてしまいました。
[今日の問題点]
今日の問題点は、エラーコードの取得方法です。最近の修正でテキスト(※1)にエラーコードの取得方法が記載されており、難しいロジックではなかったので、1行追加して試験をしていなかったのですが、DB関連関数以外でキーの重複エラーが発生しても、次の処理を行うプログラムが複数あったため、今日は同修正部分の動作を確認しました。以下のコードの@〜Cでは、正確な値が取得できませんでした。
//SQL文実行処理
try {
//レコード追加メソッドを実行する
$rtn = $this->stmt->execute();
C$this->getDbConnect->errorCode();
} catch (PDOException $e) {
//エラーコードを取得する
@$this->getDbConnect->errorCode();
A$this->getDbConnect->errorInfo();
B$this->$this->stmt->errorCode();
$this->setErrorNo($e->errorInfo[1]);
//レコード追加処理が失敗した場合
//異常処理結果のメッセージを設定する
$this->setErrorMessage($e->getMessage());
//サーバーサイト変数を削除する
unset($_SESSION["ret"]);
//返却値を設定して呼び出し元へ制御を移す
return false;
}
@の「@$this->getDbConnect->errorCode();」、DBに接続するためのインスタンスからエラーコードを取得しようとしているものです。それでエラーコードを取得しようとすると、コードが"00000"です。ただ、$e->getMessage();では、エラーが拾えているので、エラーが発生しているのは確かです。
そして、Aの「$this->getDbConnect->errorInfo();」で取得できる値は配列です。その時点で違うと思ったのですが、このときダンプを取っていれば、もしかしたら最短でこの問題を解決できたかもしれません。
続いて、Bの「$this->stmt->errorCode();」実行時のステートメントなのですが、このときには、エラーコードが出力されて"23000"。ただ、これいろいろなエラーの時に「SQLSTATE[23000]」って感じで表示されるコードです。今回は、重複エラーが発生した場合のエラーコード"1062"を取得したいので、NGです。
そしてCなのですが、catchに入ってからは取得できないのでは?なんて考えて、SQL文実行直後に入れてみました。これtry〜catchの確認試験で、tryでエラーが発生した直後、後続にどんなロジックがあっても、catchに飛ぶと調べて分かっているのに、ここにもロジックを入れて確認してしまいました。これも当然NGです。
何やってもうまくいかないので、インターネットでいろいろ調べて行き着いたのが、「$e->errorInfo[1]」・・・。PDOException $eで取得した変数$eにエラーコードが入っていたようです。これで、やっと問題解決。疲れました。
[あとがき]
今日は、この作業だけでなく、Update文、Delete文も修正が完了しました。明日からは計画していたプログラム修正に入れる予定です。はじめてやる事って大変なんですよね(笑)。ビックバンテスト今から憂鬱です。ただ、実はそれも楽しみなんですけれどね!
では、また!
■Prototype EVE変更プログラム進捗状況
★DB関連関数以外
修正ファイル本数 5/29本(0本ファイル修正)
修正箇所 192/396
※1)テキストとは、独習PHPではありません。別な資料を参考としていました。なお、現在気づいた内容としては、独習PHPには、errorCode、errorInfoともP435に記載がございました。
【このカテゴリーの最新記事】