WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

ZendFrameworkでZend_Dbを利用してデータベースに接続する

      2012/12/17

データベース抽象化レイヤについて

ZendFrameworkでデータベースに接続したり、クエリを送信したりする場合はデータベース抽象化レイヤと呼ばれるものがインターフェースとして利用されます。
データベース抽象化レイヤとは、異なる種類のデータベースを一元的な操作感で利用できるようにするためのものです。

例えば、PHPではMySQLに接続する場合はmysql_connect関数を使用します。一方、PosgreSQLに接続する場合はpg_connect関数を使用します。
データベース抽象化レイヤを利用しないでコーディングするには、このようなデータベースの種類に依存した関数を利用することになり、後々システムのデータベースを変更した場合は、それに伴ってデータベース関数もすべて書き換える必要が出てきます。
データベース抽象化レイヤを利用すると、データベースの種類に依存しないコーディングを行うことができます。
ZendFrameworkでのデータベース抽象化レイヤにはZend_Dbというものがありますが、このライブラリを利用するとデータベースに接続するときは接続先のデータベースがMySQLであろうがPosgreSQLであろうがgetConnectionというメソッドで接続することができます。
このような抽象化レイヤが提供する汎用性のある関数でコーディングすることで、仮に後でシステムのデータベースがMySQLからPosgreSQLに変更されるようなことがあってもZend_Dbのアダプタ(※後述)をデータベースの種類にあわせて変更するだけで、コードそのものは変更しなくても済みます。

Zend_Dbでのデータベースへの接続

下記のスクリプトはZendFrameworkのデータベース抽象化レイヤ”Zend_Db”でのデータベースへの接続例です。

sample4zend_db.php
<?php echo '<?php'; ?>

// Zend_Dbライブラリの読み込み 
require_once 'Zend/Db.php'; 
 
// DB接続情報を連想配列に格納 
$dbInit = array( 
    'host'     => 'localhost', 
    'username' => 'hoge', 
    'password' => 'hage', 
    'dbname'   => 'sample' 
); 
 
try { 
    // 接続 
    $db = Zend_Db::factory('Pdo_Mysql', $dbInit); 
    $db->getConnection(); 
    echo 'OK!'; 
 
} catch (Zend_Exception $e) { 
    // 例外発生時 
    die($e->getMessage()); 
 
} 
 
// DBへの接続を切断 
$db->closeConnection();

非常に単純なスクリプトなので、特筆すべきところは、try文の部分ぐらいです。
tryのブロックでは、Zend_Dbのfactoryメソッドで第一引数にデータベースの接続に使用するアダプタを、第二引数に接続情報をそれぞれ渡しています。
factoryメソッドの構文は以下のとおりです。

Zend_Db::factory($adapter, $config)

アダプタについての解説は以下が参考になります。

アダプタとは、Zend_Dbが個々のデータベースにアクセスするための直接の機能を提供するクラスです。Zend_Dbでは、接続するデータベースを変更した場合にも、このアダプタを切り替えるだけで、アプリケーションそのものにはほとんど影響を与えずに対応することができます。

Zend Framework徹底入門

このスクリプトでは”Pdo_Mysql”というアダプタを利用してMySQLに接続しています。
下表はRDBMSとその対応アダプタの一覧です。

データベース アダプタ名
MySQL Pdo_Mysql
Mysqli
PostgreSQL Pdo_Pgsql
Oracle Pdo_Ocl
Oracle
SQLite Pdo_Sqlite

二番目の引数である接続情報は、連想配列で渡します。
連想配列には、キーにオプション名を指定しておきます。
接続情報のオプション名の一覧は下表のとおりです。

オプション名 オプションの概要
host データベースのホスト名
username ユーザ名
password 指定したユーザアカウントのパスワード
dbname データベース名
port 接続するポート番号

なお、factoryメソッドを実行した時点でデータベースへの接続が確立されているわけではなく、実際にデータベースへの接続を確立するのはクエリが発行されるときになります。
これを”遅延接続”といい、これによって必要になるかどうかわからない無駄な接続が確立してしまうのを防いでいます。

このスクリプトではfactoryメソッド実行後、getConnectionメソッドで明示的に接続を行っています。
このgetConnectionメソッドは接続を強制的に行うメソッドです。
このスクリプトでは便宜上getConnectionメソッドを使用していますが、通常はクエリを発行する際に接続が自動的に確立されるため、getConnectionメソッドで明示的に接続を行う必要はありません。

確立した接続を切断するのは、スクリプトの末尾にあるcloseConnectionメソッドの役割です。
なお、このcloseConnectionメソッドに関しても、通常スクリプトが終了したときに接続は自動的に切断されるようになっているため、明示的にcloseConnectionメソッドで切断する必要はありません。
なんらかの理由で明示的に切断を行う必要があるときにだけ使用するといったかんじでOKです。

データベースに接続できないような例外が発生した場合はcatch文のブロックでエラーメッセージが出力されます。

 - ZendFramework , , , , ,