DB_DataObjectでDBから出たエラーを取得する方法
今さらPEAR::DB_DataObjectかよ…という言葉も聞こえてきそうですが、必要な場面があったのでここに記しておきたいと思います。
通常、DB_DataObjectインスタンスを使ってデータをinsertする場合、
$data = array(
'my_id'=>NULL,
'my_data'=>'sample'
);
$dbo = DB_DataObject::factory('my_table');
$dbo->setFrom($data);
$newid = $dbo->insert();
こんな感じでデータを追加したりしますよね。 エラーの場合は $newid にfalseが返ってくるのでIF文で判断すれば「うまくいったか、いかなかったか」だけは判断できます。
しかし「ユニークな値が重複した(duplicate entry)」等の「DB側でどんなエラーが発生したのか」が分かりません。 ドキュメントを見てもなんだかはっきりしないことが書いてあって、サンプルコードも用意されていないので、どう組めば良いのか分からない。
そこで、実際のコードを読んでみたんですが、エラーを発生させている raiseErrorメソッドの中で以下のコードがありました。
$error = &PEAR::getStaticProperty('DB_DataObject','lastError');
DB_DataObjectクラスのスタティックプロパティである「lastError」を拾っています。
この$error変数の中身は「DB_Error」インスタンスになっているので、DB_Errorの各種メソッドが利用できます。 例えば、最初のコードの続き。
...
$dbo->setFrom($data);
$newid = $dbo->insert();
if (!$newid) {
$error = &PEAR::getStaticProperty('DB_DataObject','lastError');
print($error->getMessage()); //単純なエラーメッセージを返します。
print($error->toString()); //どのデータが、どのようなエラーを起こしたのかまで返します。
}
他にも getCode()、getUserInfo() などのメソッドを使ってうまくエラー情報を処理することができるようになりますので、ぜひ試してみてください。
2012-11-09