[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 メーリングリストの案内