So-net無料ブログ作成
検索選択

Zend Frameworkについて(DB編2) [Zend Framework]


前回の続きということで、DBのトランザクション、およびDBの更新系処理について。
マニュアルでは5.1.4からです。


トランザクション処理



 トランザクションは、データの整合性を保つために必要不可欠な機能である。

 Zend_Dbではトランザクション処理を明記しない場合は、
 「自動コミット」モードという動作をしてしまう。

 そのため、前回のDB編1で行った「query」メソッドでSQLを実行する場合、
 SQLにUpdateやDeleteを行った場合に自動的にコミットされDBに反映されてしまう。
 これだと多数のアクセスが同時に行われる可能性があるシステムの場合、
 データの不整合が生じてしまう可能性があるので、

 その対策としてZend_Dbでは、トランザクション機能が提供されている。
 (※正確にはDBMSのトランザクション機能を使用しているので、機能が無ければ使えない)

 トランザクション処理を行う場合、Zend_Dbの以下のメソッドを利用する。

 トランザクションの開始

$db->beginTransaction();


 コミット

$db->commit();


 ロールバック

$db->rollBack();


 トランザクション処理を組み込んだクエリ実行のサンプルを作ってみる。

 超絶簡単サンプル1

public function runSQL($sql) {
 // トランザクション開始
 $this->_db->beginTransaction();
 try {
  // クエリ実行
  $this->_db->query($sql);
  // 成功した場合はコミットする
  $this->_db->commit();
  return ture;
 } catch (Exception $e) {
  // 失敗した場合はロールバックしてエラーメッセージを返す
  $this->_db->rollBack();
  return $e->getMessage();
 }
}


 ※1 $this->_dbにDBに接続したDBオブジェクトが格納されている。
 ※2 $sqlには更新や削除が行われるSQLが与えられるとする。

 この結果、処理が正常に行われた場合はコミットされ戻り値に「true」を返し、
 エラーが発生した場合はロールバックを行い、エラーメッセージを返すようになる。


レコード追加処理



 Zend_Dbでは、「insert」文をSQLで書かなくても実施できる仕組みが提供されています。

 それが「insert」メソッドを利用した方法で、追加するデータと追加するテーブル名を渡すと、
 追加するデータを自動的にクォートした状態で、レコードの追加処理が行われます。

 超絶簡単サンプル2
 レコード追加処理

public function runInsert() {
 // 追加するデータ
 $row = array (
  'id' => 1,
  'name' => 'hoge',
  'text' => 'test',
 );
 // 行を挿入するテーブル
 $table = 'test';
 // 行を挿入し、その行の ID を取得します
 $ret = $db->insert($table, $row);


 ※1 $this->_dbにDBに接続したDBオブジェクトが格納されている。
 ※2 「test」テーブルには id、name、text の3つの項目があるとする。
 ※3 トランザクション処理は割愛(本当は当然書かなきゃダメ)。

 処理が成功した場合、$retには追加された行の数、このサンプルでは1行なので「1」が返され、
 $rowで定義したデータレコードが作成されます。


レコード更新処理



 Zend_Dbでは、「update」文をSQLで書かなくても実施できる仕組みが提供されています。

 それが「update」メソッドを利用した方法で、更新するデータ、テーブル、条件を渡すと、
 更新するデータを自動的にクォートした状態で、レコードの更新処理が行われます。

 超絶簡単サンプル3
 レコード更新処理

public function runUpdate() {
 // 更新するデータ
 $set = array (
  'name' => 'poge',
  'text' => 'namahage',
 );
 // 行を挿入するテーブル
 $table = 'test';
 // WHERE 句
 $where= 'id='.$db->quote('1');;
 // テーブルを更新して、更新された行数を返す
 $ret = $db->update($table, $set, $where);


 ※1 $this->_dbにDBに接続したDBオブジェクトが格納されている。
 ※2 「test」テーブルには id、name、text の3つの項目があるとする。
 ※3 トランザクション処理は割愛(本当は当然書かなきゃダメ)。

 処理が成功した場合、$retには更新された行の数、このサンプルではKeyを条件に設定しているので、
 1行更新ということで「1」が返されます。
 ちなみに、$setで指定している更新情報は自動的にクォートされるが、
 $where句で指定する値は自動的にクォートされないので、明示的にクォート処理を行う必要がある。


レコード削除処理



 Zend_Dbでは、「delete」文をSQLで書かなくても実施できる仕組みが提供されています。

 それが「delete」メソッドを利用した方法で、削除するレコードのあるテーブル、条件を渡すと、
 削除するレコードの削除処理が行われます。

 超絶簡単サンプル4
 レコード削除処理

public function runDelete() {
 // 行を挿入するテーブル
 $table = 'test';
 // WHERE 句
 $where = $db->quoteInto('id = ?', '1');
 // テーブルを更新して、更新された行数を返す
 $ret = $db->delete($table, $where);


 ※1 $this->_dbにDBに接続したDBオブジェクトが格納されている。
 ※2 「test」テーブルには id=1 のレコードが存在するとする。
 ※3 トランザクション処理は割愛(本当は当然書かなきゃダメ)。

 処理が成功した場合、$retには削除された行の数が渡されます。
 このサンプルではKeyを条件に設定しているので、1行削除ということで「1」が返されます。


長くなってしまったので、今回はこの辺で。

次回は参照についてやります。


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL:
※言及リンクのないトラックバックは受信されません。

関連リンク

メッセージを送る

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。