Zend Frameworkのデータベース接続

DBの接続はZend_Dbクラスのfactoryメソッドを使用します。

[参考記事] Zend_DBの基本
[参考記事] Zend_DBのSELECTメソッドのまとめ

まずはZend_Dbを読み込みます。

require_once 'Zend/Db.php';

コントローラ内部などでは、Zend::loadClassを使用することもできます。

Zend::loadClass('Zend_DB');

このfactoryメソッドにPDOドライバ名(PDOパラメータ)とDBの接続情報を渡すと、データベースに接続できます。

Zend_Db::factory(【PDOドライバ名】, 【DB接続情報】);

第一引数に渡す値

Zend_Dbでは、次のRDBMS用のPDOドライバに対するアダプタクラスが実装されています。

PDOドライバ名データベースの種類
PDO_IBMIBM DB2 および Informix Dynamic Server (IDS)
PDO_MYSQLMySQL
PDO_MSSQLMicrosoft SQL Server
PDO_OCIOracle
PDO_PGSQLPostgreSQL
PDO_SQLITESQLite

RDBMS用の拡張モジュールを使用するアダプタクラスも実装されています。

アダプタ名データベースの種類
MYSQLIMySQL
OCI8Oracle
IBM_DB2IBM DB2 および DB2/i5
PHP_INTERBASEFirebird/Interbase

PDO_MYSQLはZend_Dbのトランザクションが使えません。MYSQLIは使えます。
[参考記事] トランザクション処理

第二引数に渡す値

DB接続情報は、ホスト名・ユーザ名・パスワード・データベース名・DBの文字コードを配列で渡します。

$params = array ('host' => '【ホスト名】',
    'username' => '【ユーザ名】',
    'password' => '【パスワード】',
    'dbname'   => '【データベース名】',
    'charset'   => '【文字コード】');

PDO_MYSQLやPDO_PGSQLは、文字コードをcharsetで渡すことで、SET NAMESを実行します。

接続例

データベースサーバMySQL
ホスト名127.0.0.1
ユーザ名user
パスワードpass
データベース名datebase

だったとすると、次のようになります。

$params = array ('host' => '127.0.0.1',
    'username' => 'user',
    'password' => 'pass',
    'dbname'   => 'datebase',
    'charset'   => 'UTF8');

$db = Zend_Db::factory('PDO_MYSQL', $params);

これで$dbにデータベース接続インスタンスが生成されます。

コントローラやモデルで使用するためには

上記の例では単発での使用方法になります。

データベースの接続については、サイト内のいろいろなところで使用すると思います。
その場合に、各モデルや各コントローラ内でDBの接続情報を書いてはいけません。
なぜならデータベースを変更したときに、すべてのファイルを変更しなければいけないからです。

Zend Frameworkでは設定情報は
application/configs/application.ini

基本的な設定ファイルの読み込みは
Bootstrap.php
で書くようになっています。

このルールに従うと次のようになります。

application/configs/application.ini

db.adapter = PDO_MySQL
db.params.host = "127.0.0.1"
db.params.username = "username"
db.params.password = "password"
db.params.dbname = "dbname"
db.params.charset = "UTF8"

application/Bootstrap.php

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initDb()
    {
        try{
            $options = new Zend_Config($this->getOptions());
            $dbConfig = $options->db;
            $dbConect = Zend_Db::factory($dbConfig->adapter, $dbConfig->params);
            Zend_Registry::set('db', $dbConect);
            Zend_Db_Table::setDefaultAdapter($dbConect);
        }catch(Exception $e){
// Bootstrap.php内ではExceptionを表示させる機能は読み込まれていないため、ここに書きます。
            echo '<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" />';
            echo '<title>エラー</title></head><body>';
            if ('production' == APPLICATION_ENV){
                echo '<h1>エラーです。</h1>';
            }else{
                echo '<h1>データベースに接続できません。</h1>';
                echo '<h3>Message</h3>';
                echo $e->getMessage();
                echo '<h3>File</h3>';
                echo $e->getFile();
                echo '<h3>Line</h3>';
                echo $e->getLine();
                echo '<h3>Trace</h3>';
                echo '<pre>';
                echo $e->getTraceAsString();
                echo '</pre>';
            }
            echo '</body></html>';
            exit;
        }
    }
}

このようにします。

使い方(1)

Zend_Registry::set('db', $dbConect);

と指定しているので、モデルやコントローラで次のように書くと、DB接続インスタンスを呼び出すことができます。

$db = Zend_Registry::get('db');

使い方(2)

Zend_Db_Table::setDefaultAdapter($dbConect);

と指定しているので、Zend_Db_Table_Abstractを継承したクラスのデフォルトの接続となります。

次の3つはZend_Db_Table_Abstractクラスの中では、$db = Zend_Registry::get('db');と同じになります。

$db = $this->getDefaultAdapter();
$db = $this->getAdapter();
$db = $this->_db;

複数のデータベースを使用する方法

複数のサイトを、1つのデータベースサーバで運用している場合、 サイトごとにデータベースとは別に郵便番号データなどを共通のデータベースにしている場合があります。

このように1つのサイトで複数のデータベースを使用するケースはあると思います。

application/configs/application.ini

db.adapter = PDO_MySQL
db.params.host = "127.0.0.1"
db.params.username = "username"
db.params.password = "password"
db.params.dbname = "dbname"

dbsub.adapter = PDO_MySQL
dbsub.params.host = "127.0.0.1"
dbsub.params.username = "username2"
dbsub.params.password = "password2"
dbsub.params.dbname = "dbname2"

application/Bootstrap.php

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initDb()
    {
        try{
            $options = new Zend_Config($this->getOptions());
            $dbConfig = $options->db;
            $dbConect = Zend_Db::factory($dbConfig->adapter, $dbConfig->params);
            Zend_Registry::set('db', $dbConect);
            Zend_Db_Table::setDefaultAdapter($dbConect);

            $dbsubConfig = $options->dbsub;
            $dbsubConect = Zend_Db::factory($dbsubConfig->adapter, $dbsubConfig->params);
            Zend_Registry::set('dbsub', $dbsubConect);
        }catch(Exception $e){
// Bootstrap.php内ではExceptionを表示させる機能は読み込まれていないため、ここに書きます。
            echo '<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" />';
            echo '<title>エラー</title></head><body>';
            if ('production' == APPLICATION_ENV){
                echo '<h1>エラーです。</h1>';
            }else{
                echo '<h1>データベースに接続できません。</h1>';
                echo '<h3>Message</h3>';
                echo $e->getMessage();
                echo '<h3>File</h3>';
                echo $e->getFile();
                echo '<h3>Line</h3>';
                echo $e->getLine();
                echo '<h3>Trace</h3>';
                echo '<pre>';
                echo $e->getTraceAsString();
                echo '</pre>';
            }
            echo '</body></html>';
            exit;
        }
    }
}

このようにします。

使い方

基本的には最初に書かれたデータベースを使用します。

$db = Zend_Registry::get('db');

もう1つのデータベースを使用するには次のようにして、DB接続インスタンスを呼び出します。

$dbsub = Zend_Registry::get('dbsub');

関連記事

スポンサーリンク

COALESCE関数 NULL値でない最初の引数を返す

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る