cakephp1.2でqueryした時のエラーをキャッチしたい
cakephp->version:1.2.2.8120
cakephpのofficialではonError()なるコールバックメソッドがあると書いてあるが、こいつが呼び出されるのはfind,read,saveといったアソシエーション上で利用できるメソッドのみだった。libs/model/datasources/dbo_source.phpを追いかけたらそれがわかった。
もっと簡単に言えば、queryを使った時はonError()はコールバックされないってことだ!
これでうわーどうしようかなーと思ったが、DboSourceの親クラスであるDataSourceのメンバ変数にerrorなるものがあり、こいつはqueryを発行してもSQLエラーを格納してくれることが分かった。エラーになるSQL文をqueryに与えたらちゃんとエラーが格納されていた。というか、queryでもexecuteでもエラーをDboSourceが捕まえなかったらエラーメッセージも出せないはずだってことに気づいた。
なので、AppModelにDboの参照を持ってくるメソッドを用意して、こんな感じで拾ってみた。errorのデフォルトはnullで、エラーがあった時だけnullではなくなる。
<?php function getDbo() { return ConnectionManager::getDataSource($this->useDbConfig); } //各Modelはこうやって使う //SQLエラーが発生したら if($this->getDbo()->error !== null) { //ログ吐くなりcakeErrorするなりロールバックするなり }
いじょ。