PHP+Zend

Zend_Db コンポーネント

共通

  • Zend_Db : Zend_Dbコンポーネントの中核

基本:

  • Zend_Db_Adapter_Abstract : データベースへの直接の操作を担当
  • Zend_Db_Statement : 発行するSQL命令を管理
  • Zend_Db_Select : SELECT 命令を動的に構築するための機能を提供

O/R マッピング

  • Zend_Db_Table : テーブルクラスの基底クラス
  • Zend_Db_Rowset : テーブルに属する行の集合(行セット)を管理
  • Zend_Db_Row : テーブルの各行の管理

その他

  • Zend_Db_Profile : 実行されたSQL命令、またその実行時間のプロファイル
PHP application  -> Zend_Db
 ->Pdo_Mysql adapter -> MySQL
 ->Pdo_Pgsql adapter -> PostgreSQL
 ->Pdo_Oci adapter -> Oracle
 ->その他 -> other..

Zend_Db対応しているデータベース

データベースアダプタ名依存モジュール
DB2Pdo_Ibmpdo_ibm
Db2ibm_db2
MySQLPdo_Mysqlpdo_mysql
Mysqlimysqli
SQL ServerPdo_Mssqlpdo_mssql
OraclePdo_Ocipdo_oci
Oracleoci8
PostgreSQLPdo_Pgsqlpdo_pgsql
SQLitePdo_Sqlitepdo_sqlite

Zend_Db::factory($adapter, $config)

hostデータベースのホスト名
username接続時に使用するユーザー名
password接続時に使用するパスワード
dbnameデータベース名
options連想配列にする
Zend_Db::CASE_FOLDING取得したカラム名を大文字・小文字に変換するか
Zend_Db::CASE_NATUAL(ディフォルト)
Zend_Db::CASE_UPPER
Zend_Db::CASE_LOWER
Zend_Db::AUTO_QUOTE_IDENTIFIERSアダプタが生成するSQLでテーブル・カラム名を自動でクォートするか
driver_optionsドライバ固有のオプション
adapterNamespaceアダプタクラスのプレフィックス(ディフォルトはZend_Db_Adapter)

<?php
require_once 'Zend_Db.php';
try {
	$db = Zend_Db::factory(
		'Pdo_Mysql',
		array(
			'host' => 'localhost',
			'username'=>'hoge',
			'password'=>'hogepw'
			'dbname'=>'zend'
		)
	); #この時点ではまだ接続は確定されていない
		$db->getConnection();
		print('データベース接続に成功しました');
	} catch (Zend_Exception $e) {
		die($e->getMessage());
	}
	$db->closeConnection(); #通常はスクリプト終了時に切断処理が行われるので書く必要はない
}

DB接続に関しての注意事項

  1. 接続に必要なモジュールが有効になっているか?
  2. データベースは起動しているか
  3. 対象のデータベースはあるか?

データベース接続情報を外部ファイルとして保持する

#hogehoge.ini
[database]
adapter = Pdo_Mysql
params.host = localhost
params.dbname = book
params.username = hoger
params.password = hogepw
#connect_ini.php
<?php
	require_once 'Zend/Config/Ini.php';
	require_once 'Zend/Db.php';
	try{
	$config = new Zend_Config_Ini('../hogehoge.ini', 'database');
	$db = Zend_Db::factory($config);
	$db->getConnect();
	print('データベース接続に成功しました');
	} catch (Zend_Exception $e ) {
		die($e->getMessage());
	}
	$db->closeConnection();

?>

Zend_DB_Adapter_Abstruct;;query($sql, $params)

$sql ; 任意のクエリ $params ; バインドするパラメータ

$db->query('SET CHARACTER SET utf8');

DbManager?クラスを使う

DbManager.class.phpをインクルードする
$db = DbManager;;getConnection();

プレイスフォルダー(名前つきパラメーター) -> :XXXX

$str = $db->query('INSERT INTO address(isbn) VALUE (:isbn)', array(':isbn"=>$_POST['isbn']));

パラメーターの置き場所で、実行時に動的にパラメーターを埋め込むことが出来る

クォート処理

Zend_Db_Adapter_Abstruct::quote($str, $type);
  • 指定された文字列に含まれる単一引用符をエスケープ処理して、文字列全体を引用符で括る

?(名前なしパラメーター)

$str = $db->query('INSERT INTO address(isbn) VALUE (?)', array($_POST['isbn']));
<?php
	require_once 'DbManager.class.php';
	$db = DbManager::getConnection();
	$str = $db->query("DELETE FROM book WHERE published <= '2008-12-12'");
	print('削除件数:'.$str->rowCount().'件');

rowCount method

  • INSERT/UPDATE/DELETE命令の実行によって影響を受けたレコード件数を取得する
  • データベースによっては取得できない場合もあるので、確実性でいえばSELECT COUNT(*)を使うべき

Zend_Db_Adapter_Abstruct::lastInsertID($table, $key))

?php require_once 'DbManager?.class.php'; $db _ DbManager?::getConnection(); $db->query("INSERT INTO guest(name, age) VALUE('洋子', 30)"); print('最新のID:'.$db->lastInsertID()); #直近のINSERT命令で取得したオートインクリメント値を取得する

※lastInsertID()は現在の接続で最後に取得したオートインクリメント値を取得する 他のユーザーからの同時実行の影響を受けるquery

SELECT MAX(id) FROM guest

結果セットの取得
データベースから取得したデータを保持するためにメモリ上に用意された仮想的なテーブル

?php require_once 'DbManager?.class.php'; $db = DbManager?::getConnection();

$stt = $db->query('SELECT * FROM book ORDER BY published DESC');

while($row = $stt->fetch(Zend_Db;;FETCH_ASSOC)){

	echo $row['isbn'].'-'.$row['title'].'-'.$row['publish'];

}

  • 結果セット内の現在のレコードをカレントレコード
  • 現在位置を示す内部的な情報のことをレコードポインタという

$db->setFetchMode?(Zend_Db::FETCH_OBJ);

  • 個別に宣言しなくてもsetFetchMode? methodで指定したら以降のfetchはすべてそのモードになる

Zend_Dbで利用可能なフェッチモード

FETCH_ASSOC連想配列 $row['isbn']フィールド名が重複した場合、先に登場したフィードが後から登場したフィールドによって上書きされる
FETCH_NAMED連想配列 $row['isbn']フィールド名が重複した場合、入れ子の配列として双方の値を返す
FETCH_NUM連想配列 $row[0]
FETCH_BOTH通常/連想配列 $row[0]/$row['isbn']
FETCH_BOUNDbindColumnメソッドでバインドされたPHP変数 $isbnフェッチした各フィールドの値を、bindColumnメソッドであらかじめマッピングされた変数にセットする
FETCH_OBJオブジェクト $row->isbn
FETCH_LAZYFETCH_BOTH/FETCH_OBJの組み合わせ
FETCH_COLUMNスカラー値(先頭カラムの値のみ)
FETCH_UNIQUE先頭行をキーとした連想配列、FETCH_COLUMNとともに使用
FETCH_GROUP先頭行をキーとした連想配列、FETCH_COLUMNとともに使用

fetchAll method

  • 結果セットの内容を取得出来る

fetchOne method

  • 結果セットにおける先頭行/先頭列の値を取得する

fetchCol method

  • 結果セットの先頭列のみを取得する
  • 結果セットの内容が1列しかない事が分かっている場合に使用する

fetchRow method

  • 結果セットの先頭行のみを取得する
  • 主キー列をキーを検索した場合など、結果セットの内容が1行しかないことがあらかじめ想定できる場合などに。

fetchPairs method

  • 結果セットの特定の2列をキー/値の連想配列として返す

bindXxxx method

PARAM_NULLNULL型
PARAM_INT整数型
PARAM_STRCHAR/VARCHARなどの文字列型
PARAM_LOBLarge Object型
PARAM_STMTSQLクエリ

prepare/execute

  • Zend_Db_Adapter_Abstract::prepare($sql);
  • Zend_Db_Statement::execute($params);

bindValue

  • 値を直接バインドする
  • Zend_Db_Statement::bindValue($param, $value, $type)
  • 例 ; $stt->bindValue(':type', $_FILE['photo']['type'], Zend_Db::PARAM_STR);

bindParam

  • 指定された変数の参照をバインドする、executeメソッドの実行時に評価される
  • 変数の値など、prepareの時点ではまた分からない場合などに使用する

Select method

require_once 'DbManager?.class.php'; $db = DbManager?::getConnection(); #データベース接続を取得 $sel = $db->select(); #SELECT命令構築のためのZend_Db_Selectオブジェクトを生成 $sel->from('book', array('isbn', 'title', 'price')); #from 句を追加 $sel->order('publised'); #order句を追加

#sel->where('publish = ?', $_POST['publish']); #where句を追加 $stt = $db->query($sel); #Zend_Db_Selectオブジェクトの内容に基づいてクレイを実行 print_r($stt->fetchAll());

自動生成されたクエリの確認

__toString ; 生成されたクエリの結果
__getPart ; 取得したい句を得る(定数あり)

メタデータ

  • listTable : データベースに含まれるテーブルの一覧
  • describeTable : 指定されたテーブル構成情報を取得する(キーあり)

トランザクション処理

  • 両方成功か、両方失敗
  • 確定した際にコミットする
    • beginTransaction/commit
  • 失敗したらロールバックする
    • rollback

$db = DbManager?::getConnection(); $db->beginTransaction(); #トランザクション処理を開始する $db->query("INSERT INTO book ('isbn') VALUE("1023-hoge")');\ $db->commit(); } catch (Zend_Db_Statement_Exception $e) {

	$db->rollBack();
	print($e->getMessage());

} catch (Exception $e){

	print($e->getMessage());

}

プロファイリング

Zend_Db_Profile class

  • 実際に発行されたクエリの情報(生のSQL命令、実行時間など)を容易に記録できる
  • デバック用に有効な機能
  1. 後でチェック++

INSERT/UPDATE/DELETEなどは後でチェック

Zend_View(ビュー機能)

Zend_Layout(ツーステップビューパターン)

Zend_Validate(検証機能)

Zend_Uri(URI関連)

Zend_Filter(フィルタリング機能)

Zend_Filter_Input(検証/フィルタ管理)


Last-modified: 2012-03-12 (月) 17:05:43 (166d)