トランザクション制御
Zend_Dbのアダプタクラスでは、テーブル更新のSQL文を実行すると自動でコミットを行うのがデフォルトの動作となっています。しかし実際にはSQL文を1個実行するたびにコミットするのではなく、複数のSQL文をひとまとめにして更新を行うためにトランザクションの制御を自分で行わなくてはならない場合があります。アダプタクラスにはトランザクション制御のためのメソッドが用意されているので、使い方を見てみましょう。
<?php require_once 'Zend/Db.php'; require_once 'Zend/Config/Ini.php'; $config = new Zend_Config_Ini('config/db_info.ini', 'sample_db'); $db = Zend_Db::factory($config->db); // トランザクションを開始します $db->beginTransaction(); try { // テーブルを更新します $db->insert('message_board', array('id' => 4, 'message' => 'I feel good.')); $db->delete('message_board', 'id = 3'); // コミットして変更を確定します $db->commit(); } catch(Exception $e) { // 例外が発生したらロールバックします $db->rollback(); }
beginTransactionメソッドを実行すると、手動制御のトランザクションが始まります。以降、commitメソッドまたはrollbackメソッドを呼ぶまでが1つのトランザクションになります。
この例ではinsertメソッドを1回とdeleteメソッドを1回実行し、それをまとめてコミットしています。更新が失敗した場合は例外を捕捉し、rollbackメソッドでまとめて取り消します。insertメソッドとdeleteメソッドを1つのトランザクションの中で実行しているため、両方の更新がテーブルに反映されるか、どちらも取り消されるかのどちらかになります。

クエリの情報を取得するZend_Db_Profiler
Zend_Db_Profilerクラスを使うと、クエリの情報を取得できます。取得できる情報には、実行したSQL文と所要時間が含まれています。これを利用して時間のかかっているSELECT文を探し出すなど、データベースの性能に関する情報を得ることができます。Zend_Db_Profilerの使用例を示します。
<html> <head> <title>Zend_Db_Profilerの使用例</title> </head> <body> <?php require_once 'Zend/Db.php'; require_once 'Zend/Config/Ini.php'; $config = new Zend_Config_Ini('config/db_info.ini', 'sample_db'); $db = Zend_Db::factory($config->db); // プロファイラを取得します $profiler = $db->getProfiler(); // プロファイラを有効にします $profiler->setEnabled(true); // プロファイラの情報をリセットします $profiler->clear(); $sql = "SELECT message FROM message_board"; $result = $db->fetchAll($sql); print_r($result); echo "<hr/>"; // 実行したSQL文を表示します echo $profiler->getLastQueryProfile()->getQuery() . "<br/>"; // SQL文実行の所要時間を表示します echo "所要時間" . $profiler->getLastQueryProfile()->getElapsedSecs() . "秒<br/>"; ?> </body> </html>
アダプタのgetProfilerメソッドでプロファイラを取得します。プロファイラは初期状態で無効になっているので、setEnabledメソッドで有効に切り替えてクエリの情報を収集させます。

Zend_Db_Profilerのメソッドを表にまとめます。
| メソッド | 概要 |
| setEnabled($param) | プロファイラの有効・無効を切り替える |
| clear() | プロファイラの情報をリセットする |
| getTotalNumQueries() | 情報を取得したクエリ数を返す |
| getTotalElapsedSecs() | 情報を取得したクエリの所要時間の合計を返す |
| getQueryProfiles() | すべてのクエリ情報を配列で返す |
| getLastQueryProfile() | 最後に実行したクエリの情報を返す |
getQueryProfilesメソッド、getLastQueryProfileメソッドで取得できるのはZend_Db_Profiler_Queryクラスのオブジェクトで、1回のクエリの情報を保持しています。Zend_Db_Profiler_Queryのメソッドを表にまとめます。
| getQuery() | クエリのSQL文を返す |
| getQueryParams() | Zend_Db_Statementによるクエリのパラメータを配列で返す |
| getElapsedSecs() | クエリの所要時間を返す |
まとめ
今回は、Zend_Dbによる基本的なデータベースアクセスの方法を扱いました。次回はオブジェクト指向と相性のよいZend_Dbの使い方として、テーブルに対応するクラスを作りMVCアプリケーションの中で使用する例を取り上げたいと思います。
