CodeZine(コードジン)

特集ページ一覧

Zend Framework入門(6):抽象化レイヤによるデータベースアクセス手法 - Zend_Db(前編) -

Zend Frameworkによる実践的なPHPアプリケーション開発 6

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2008/05/15 14:00
目次

トランザクション制御

 Zend_Dbのアダプタクラスでは、テーブル更新のSQL文を実行すると自動でコミットを行うのがデフォルトの動作となっています。しかし実際にはSQL文を1個実行するたびにコミットするのではなく、複数のSQL文をひとまとめにして更新を行うためにトランザクションの制御を自分で行わなくてはならない場合があります。アダプタクラスにはトランザクション制御のためのメソッドが用意されているので、使い方を見てみましょう。

transaction.php
<?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の使用例を示します。

profiler_sample.php
<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の使用例
Zend_Db_Profilerの使用例

 Zend_Db_Profilerのメソッドを表にまとめます。

Zend_Db_Profilerの主なメソッド
メソッド概要
setEnabled($param)プロファイラの有効・無効を切り替える
clear()プロファイラの情報をリセットする
getTotalNumQueries()情報を取得したクエリ数を返す
getTotalElapsedSecs()情報を取得したクエリの所要時間の合計を返す
getQueryProfiles()すべてのクエリ情報を配列で返す
getLastQueryProfile()最後に実行したクエリの情報を返す

 getQueryProfilesメソッド、getLastQueryProfileメソッドで取得できるのはZend_Db_Profiler_Queryクラスのオブジェクトで、1回のクエリの情報を保持しています。Zend_Db_Profiler_Queryのメソッドを表にまとめます。

Zend_Db_Profiler_Queryの主なメソッド
getQuery()クエリのSQL文を返す
getQueryParams()Zend_Db_Statementによるクエリのパラメータを配列で返す
getElapsedSecs()クエリの所要時間を返す

まとめ

 今回は、Zend_Dbによる基本的なデータベースアクセスの方法を扱いました。次回はオブジェクト指向と相性のよいZend_Dbの使い方として、テーブルに対応するクラスを作りMVCアプリケーションの中で使用する例を取り上げたいと思います。



  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:Zend Framework入門

もっと読む

著者プロフィール

  • WINGSプロジェクト 川北 季(カワキタ ミノル)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5