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_IBM | IBM DB2 および Informix Dynamic Server (IDS) |
PDO_MYSQL | MySQL |
PDO_MSSQL | Microsoft SQL Server |
PDO_OCI | Oracle |
PDO_PGSQL | PostgreSQL |
PDO_SQLITE | SQLite |
RDBMS用の拡張モジュールを使用するアダプタクラスも実装されています。
アダプタ名 | データベースの種類 |
---|---|
MYSQLI | MySQL |
OCI8 | Oracle |
IBM_DB2 | IBM DB2 および DB2/i5 |
PHP_INTERBASE | Firebird/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');
関連記事
- Composerコマンドでウクライナへのメッセージが表示されたことがあります
- Live Commerceとは
- CakePHP、Symfony、Zend Frameworkの比較
- Zend_Authでは重複するID・パスワードに注意
- リダイレクトとフォワード
- クエリデバッグする方法
- 'Zend_Db_Statement_Exception' with message 'SQLSTATE[HY000]: General error' とは
- Zend_DBのSELECTメソッドのまとめ
- Zend_DBの基本
- Zend_Authによる認証 (ログインページを作る)
- Smartyを利用する方法
- ビューヘルパー
- 環境を分ける方法
- ビュー(テンプレート)の基本
- アクションコントローラの基本
- アクションコントローラとビューの関係
- コマンドで雛形を作る CLIツール
- 推奨ディレクトリ構成
- 環境設定とインストール
- 最小版のファイル一覧
- ファイル一覧
- 基本的な特徴
- MySQL MariaDB
- PostgreSQL
- Oracle
- LIMITで件数制限をしつつ、全件数を取得する方法 SQL_CALC_FOUND_ROWS FOUND_ROWS()
- データベースを定時バックアップする方法(毎日バックアップする処理)
- SQL文で特定の曜日のみ抽出するには
- 文字列型(データ型)のまとめ
- DB設計を見直してEC-CUBEを高速化する
- MySQLのソケットエラー
- OpenPNE3のデータベースの設定
- コマンドやphpMyAdminで複数のデータベースに接続できるユーザーを作成する方法
スポンサーリンク