ZendFramework:Zend_Db

Zend_Dbの使い方を調べたのでその辺をメモ。


PDOを使った場合の例

$db = Zend_Db::factory('Pdo_Mysql', $dbConf);


SELECT系の例 (テーブル名test)

$select = $db->select();
$select->from('test', '*');
$select->where('id = ?', 1);
$select->orWhere('category = ?', a);

INSERT系の例

$data = array(
'title' => 'titleText',
'description' => 'descriptionText',
'category' => 'categoryName',
);
$db->insert('test', $data);


UPDATE系の例

$data = array(
'title' => 'titleText',
'description' => 'descriptionText',
'category' => 'categoryName',
);
$where[] = $db->quoteInto('id = ?', 1);
$db->update('test', $data, $where);

andでWHERE文を追加したい時

$where = $db->quoteInto('id = ?', 1);
$where
= $db->quoteInto('category = ?', categoryName);
$db->update('test', $data, $where);

orでWHERE文を繋ぎたい時

$orWhereA = $db->quoteInto('id = ?', 1);
$orWhereB = $db->quoteInto('category = ?', 'categoryName');
$where[] = $orWhereA . ' or ' . $orWhereB;
$db->update('test', $data, $where);

ちなみに、こんな記述はできそうでできなかった

$where[] = $db->quoteInto('id = ? || category = ?', 1, 'categoryName');

この出力は

id = '2' || category = '2'

となる。


これまでの例ではSQLインジェクションは心配しなくてよかったが、
下記のようなWHERE節の例では、SQLインジェクションの可能性がある。

// NGな実装
$where[] = "id = " . $_GET['id'];

きちんとquoteIntoをかけてあげる必要がある。

$where[] = $db->quoteInto('id = ?', $_GET['id']);


詳しくは、Zend_Dbのドキュメントを参考
http://framework.zend.com/manual/ja/zend.db.adapter.html