[PHP-users 23898] Re: DB_DataObjectのKEYを設定するには?
Ushiro
ushi9999 @ yahoo.co.jp
2004年 12月 13日 (月) 09:51:24 JST
こんにちは。ushiroと申します。
> 何とかできました。が、insert()やupdate()が動きません。
> 調べてみると、DB_Object::keysの戻り値が空の配列になっています。
以前、何かの処理でキー値が返ってこなかったことがありました。
getLinksしてたとか、なんとか、、、あやふやな記憶の上今回のことと関係ない
かもしれません。スミマセン。
> トランザクション制御や(SQLiteには無いのはわかっていますが(^^;))ロッ
> ク制御は、DB_DataObjectにはないのでしょうか?
> この辺を抽象化してくれれば、これからはDB_DataObject一本でいけるんですけ
> どねぇ……。
主にこちらにレスです。
トランザクション処理してます。(以下サンプルコード。typoあるかも)
==================================
$tbl = DB_DataObject::factory("target_table");
$db = $tbl->getDatabaseConnection(); //これでDBオブジェクトがとれる
$db->autoCommit(False);
$db->query("BEGIN"); //トランザクション開始
$db->query("LOCK TABLE target_table IN SHARE ROW EXCLUSIVE MODE");
//必要に応じてロックレベルを設定。これはPostgreSQLのもの
//$tblにいろいろ値をセットする処理
// :
$cnt = $tbl->update();
if (PEAR::isError($tbl->_lastError) { //エラー判定
$db->query("ROLLBACK"); //ロールバック
return False;
}
if (cnt <= 0) {
$db->query("ROLLBACK");
return False;
}
$db->query("COMMIT"); //正常ならコミット
return True;
==================================
要は DBオブジェクトを取得してしまい、後はqueryメソッドで制御するという方法です。
複数のテーブルを同じトランザクションでも制御できるんですが、
最初のDataObjectのオブジェクトを作ってからでないとDBオブジェクトがとれな
いのでスマートな作りとはいえません。。が、仕方なくやってます。
#自力でsetDatabaseConnection()を作ればいいと、以前助言をいただいたまま
#実装できずに現在に至っています(^^;;;
*-*-*-*-* Syrup Factory *-*-*-*-*
*-* USHIRO Kaori syrup @ neo.nifty.jp *-*
PHP-users メーリングリストの案内