Zend_DBの基本

Zend Frameworkではデータベース操作に基本的にZend_DBを用います。
これによってSQLサーバの種類を意識せずクエリを実行することが可能です。
例えばMySQLで使用していたシステムでも、アダプタを変更するだけでPostgreSQLやOracleで使用することができます。
ただし個々のデータベースサーバ特有のSQL文を使用してしまうと、このメリットはなくなるため、 汎用性を考えるならSQL文は直接書かないようにしたほうがいいです。

[参考記事] Zend Frameworkのデータベース接続
クエリの実行
クォート処理
レコード挿入処理(INSERT)
レコード更新処理(UPDATE)
レコード削除処理(DELETE)
トランザクション処理

レコード参照処理(SELECT)
fromメソッド
joinメソッド
whereメソッド
limitメソッド、limitPageメソッド
orderメソッド
groupメソッド
havingメソッド

クエリの実行

クエリ(SQL文)を直接実行するには、Zend_DBのqueryメソッドを使います。
queryメソッドにSQLを渡すと、結果がZend_Db_Statement_Pdoオブジェクトで返ります。
このオブジェクトにはクエリ情報とDBの接続情報が含まれます。
SELECTでは「fetchAll」メソッドを実行する事で、結果を配列で取得できます。

$result = $db->query('select * from test');
$row = $result->fetchAll();

またqueryメソッドを実行した時点で、SQLサーバにはクエリが送信されます。

INSERT文やUPDATE文などの結果がないSQLを実行した場合には、結果情報はqueryメソッドの戻り値には含まれません。
SQL文自体に間違いであった場合には、Exceptionが返ります。

クォート処理

SQL文中の値をダブルクォーテーションやシングルクォーテーションで囲む処理をクォート処理またはクォーテーション処理といいますが、 Zend_Dbにもクオートのためのメソッドが組み込まれています。

クォート処理はZend_DbのquoteメソッドまたはquoteIntoメソッド、またはqueryメソッド内でのクォート処理などが用意されています。

quoteメソッド

quoteメソッドは、それぞれの値をクオートしたものを返します。

$db->quote($text);

$sql = 'select * from test where name=' . $db->quote($text);

数値型はそのままの形、文字列型はシングルクオートで囲まれたものが返されます。

quoteIntoメソッド

quoteIntoメソッドは第一引数文字列の「?」で指定された場所に、第二引数の値をクォートした値を挿入します。

$db->quoteInto('name=?' , $text);

$sql = 'select * from test where ' . $db->quoteInto('name=?' , $text);

quoteメソッド、quoteIntoメソッドともに文字列型がシングルクオートで囲まれた値が入ります。
文字列中にシングルクオートがあった場合には、『 \ 』でエスケープされます。

例えば「It's fine today」は「'It\'s fine today'」になり、上の例だと

select * from test where name='It\'s fine today'

となります。

これはあくまでクオート処理のため、SQLの特殊文字をエスケープするための処理ではありません。
例えばMySQLで

$db->quote('%hoge%')

としても、出力は

'%%hoge%%'

にはなりません。

レコード挿入処理(INSERT)

Zend_Dbでレコードの挿入(追加)処理をするには、insertメソッドを使用します。
INSERT文の代わりに、連想配列でカラムと値を渡すことで、簡単にレコードを追加できます。
このとき追加されるデータは、クオート処理されるためデータベースには配列の値がそのまま入ります。

『 test 』という名前のテーブルに

カラム名
id1
nameテストさん
detailテストですよ

のレコードを追加する場合、下記のようになります。

// 行を挿入するテーブル名
$table = 'test';

// 追加するデータ
$params = array (
    'id' => 1,
    'name' => 'テストさん',
    'detail' => 'テストですよ',
);

// 行を挿入します。
$ret = $db->insert($table, $params);

この場合の戻り値$retは、追加された行の数が返ります。
自動採番(Auto Increment)のID値ではありません。
ID値を得るにはレコード挿入直後に $db->lastInsertId()で得られます。

Zend_Db_Table_Abstractのinsertメソッドでは挿入されたID値が返されます。

レコード更新処理(UPDATE)

Zend_Dbでレコードの更新処理をするには、updateメソッドを使用します。
UPDATE文の代わりに、条件式と連想配列でカラムと値を渡すことで、簡単にレコードを更新できます。
このとき更新されるデータは、クオート処理されるためデータベースには配列の値がそのまま入ります。

『 test 』という名前のテーブルのidが1のレコードを

カラム名
nameテストさんかな
detailテストですか

のレコードに変更する場合、下記のようになります。

// 行を更新するテーブル名
$table = 'test';

// 更新するデータ
$params = array (
    'name' => 'テストさん',
    'detail' => 'テストですよ',
);

// WHERE 句
$where= $db->quoteInto('id = ?' , 1);

// 行を更新して、更新された行数を返す
$ret = $db->update($table, $params, $where);

この場合の戻り値$retは、更新された行の数が返ります。
同じ値に更新した場合は、『値の更新なし』となるので、戻り値は『 0 』となります。

更新処理が正しく実行されたかを戻り値で判断したい場合には、カラムに更新日時などを入れ、 必ず値の変更があるようにするといいです。

レコード削除処理(DELETE)

Zend_Dbでレコードの削除処理をするには、deleteメソッドを使用します。
DELETE文の代わりに、条件式を渡すことで、簡単にレコードを削除できます。

『 test 』という名前のテーブルからidが1のレコードを削除する場合、下記のようになります。

// 行を削除するテーブル名
$table = 'test';

// WHERE 句
$where= $db->quoteInto('id = ?' , 1);

// 行を削除して、削除された行数を返す
$ret = $db->delete($table, $where);

この場合の戻り値$retは、削除された行の数が返ります。
削除された値がない場合は、『値の削除なし』となるので、戻り値は『 0 』となります。

トランザクション処理

トランザクションとは、例えば2つのレコードを挿入する処理を行ったとき、 2つ目のレコードの挿入に失敗したら1つ目のレコードの挿入を取り消すような処理のことを言います。

これによりデータの整合性が保たれます。

Zend_Dbではトランザクション処理を明記しない場合は、各処理ごとに自動コミットされます。

Zend_Dbにはトランザクション機能が用意されていますが、DBMSに依存するトランザクション機能を使用しているので、 DBMS自体にトランザクション機能が無ければトランザクションは使えません。

トランザクションの開始

$db->beginTransaction();

コミット

$db->commit();

ロールバック

$db->rollBack();

注意事項

使用するアダプターにトランザクション処理が組み込まれていないと使用することはできません。
そのため同じMySQLのアダプタでもMYSQLIはトランザクション処理を使用することができますが、PDO_MYSQLはこのメソッドを使用しても無効になります。

PDO_MYSQLでトランザクションを使用する場合には下記のように書く必要があります。

$db->query('begin');
$db->query('commit');
$db->query('rollback');

もちろんテーブルタイプがMyISAMでは使用できないので、InnoDBなどを使います。

DBMSに依存するSQL文はなるべく使用しないほうがいいので、get_classやget_parent_class、Zend_Configなどを使ってPDO_MySQLであればクエリを直接実行するように書くといいです。

[参考記事] リソースを解放しないとエラーになる

関連記事

スポンサーリンク

奈良県の電車路線、駅の一覧

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

上に戻る