Zend Framework抽象化レイヤによるデータベースアクセス

By katou - 08/09/05 - このエントリをはてなブックマークに追加このエントリをYahoo!ブックマークに追加このエントリをdel.icio.usに追加このエントリをFC2ブックマークに追加

Zend FrameworkのZend_DbとZend_Config_Iniを使って
抽象化レイヤによるデータベースへのアクセス方法をご紹介します。

Zend Frameworkにおいてデータベースとのインターフェイス部分を担当する、Zend_Dbは
O/Rマッパーのひとつです。オブジェクトとデータベースのデータを一意に紐付けてくれます。
O/Rマッピングの役割は一意に紐付けることを挙げましたが他にも様々な役割とメリットがあります

※Javaになりますが、O/Rマッピングについて
http://www.atmarkit.co.jp/fjava/rensai3/ormap01/ormap01.html

Zend_Config_IniはINI形式で保存されたファイルのデータを
Zend_Config を通じてオブジェクトのプロパティとして扱えます。

データベース抽象化レイヤを使用する利点は、
DBMSの違いを大して気にせずにアプリケーションを作成することが可能になったり
抽象化レイヤがDBMSの違いを吸収してくれるので、DBMSの切り替えが比較的容易になります。

ですが、プログラムに直接データベースの接続情報を書き込み、データベースに接続する場合と比較すると
アプリケーションとデータベースの間にデータベース抽象化レイヤが入り込むので
オーバーヘッドが発生し、負荷が高く複雑な処理には向いていません。

セキュリティについてはデータベース接続の詳細な設定情報を第三者がアクセス出来ない場所に隠蔽することでセキュリティが高まることが見込めます。SQL文は別として、データベース抽象化レイヤを利用してデータベースへ接続する際に接続情報をエスケープするクラスやファンクションに通せばSQLインジェクション対策の漏れ防止にもなります。

※SQLインジェクションについて
http://www.ipa.go.jp/security/vuln/vuln_contents/sql_solution.html

http://www.ipa.go.jp/security/vuln/websecurity.html

特定の場所に隠蔽した設定情報は他のアプリケーションからも利用することが出来るので
接続情報を一元管理したり、再利用することで生産性やソースコードの可読性の向上も見込めますが
状況に応じてデータベース抽象化レイヤを使わずに、異なる手段でSQLを実行することも必要です。

config/db.ini

------------------------------------------------------
[db_1]
db.adapter   = Pdo_Mysql
db.host      = localhost
db.username  = username
db.password  = password
db.dbname    = dbname

[db_2]
db.adapter   = Pdo_Pgsql
db.host      = localhost
db.username  = username
db.password  = password
db.dbname    = dbname
-----------------------------------------------------

configディレクトリにdb.iniファイルを作成。

select.php

------------------------------------------------------
<?php
// Zend_Dbを読み込みます
require_once 'Zend/Db.php';

// Zend_Configを読み込みます
require_once 'Zend/Config/Ini.php';

// 上記で記述しているINI形式の設定情報を読み込みます
$config = new Zend_Config_Ini( 'conig/db.ini','db_2' );

// factoryメソッドでアダプタオブジェクトを作ります
$db = Zend_Db::factory( $config->db );

// データベースに接続します
$db->getConnection();

//SQL文を代入します
$sql = "SELECT id FROM foo";

//SQL文実行します
$stmt = $db->query( $sql );

//取得した行数回、値を出力しています
while($row = $stmt->fetch()) {
echo $row['id'] . '<br />';
}

// データベースへの接続を切断します
$db->closeConnection();
------------------------------------------------------

設定情報を読み込む際に
( ‘conig/db.ini’,’db_2′ );
db.iniの[db_2]を指定することでPdo_Pgsqlを使用してデータベースに接続しています。