Zend Framework入門(6):抽象化レイヤによるデータベースアクセス手法 - Zend_Db(前編) -
Zend Frameworkによる実践的なPHPアプリケーション開発 6
ダウンロード サンプルファイル (4.1 KB)
トランザクション制御
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アプリケーションの中で使用する例を取り上げたいと思います。
この記事は参考になりましたか?
既に会員の方はを行ってください。
- この記事の著者
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
WINGSプロジェクト 川北 季(カワキタ ミノル)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
