SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Zend Framework入門

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

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

トランザクション制御

 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アプリケーションの中で使用する例を取り上げたいと思います。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Zend Framework入門連載記事一覧

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2449 2008/05/15 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー