close
Yii Framework

本身對資料庫的操作除了提供 Active Record 以外,也有提供類似 ZendFramework Zend_Db_Table 以物件透過函式組合 SQL 語法的方法:CDbCommand

基本的使用方式是:

<?php
// 取得 tbl_user 資料表中,id = 1 的資料列
$row = Yii::app()->db->createCommand()
    ->select('username, password')
    ->from('tbl_user')
    ->where('id = :id', array(':id' => 1))
    ->queryRow();
?>

其中 where 的用法是需要特別說明的地方,因為 Yii 在底層也是使用 PDO 實作,為了防止 SQL Injection 的發生,提供非常類似的使用方法;where() 函式可以引用二個參數:$conditions、$params。$conditions 是 array 型態時,包含連結方式、欄位、值;也可以使用單純 string 型態的字串。$params 非必填,是 array 型態,對應 $conditions 設定的值做 quote 的處理。範例如下:

<?php
$id = (int) $id;
$typeId = (int) $typeId;
$conditions = array(
  'and',
  'id = :id',
  'type_id = :typeId'
);
$params = array(
  ':id' => $id,
  ':typeId' => $typeId
);
// 取得 tbl_table 資料表中,id = $id AND type_id = $typeId 的資料列
$row = Yii::app()->db->createCommand()
    ->from('tbl_table')
    ->where($conditions, $params)
    ->queryRow();
?>

其他關於 where 更詳細的用法,請參考 casahama 熱心的翻譯文章(簡體)。

其實相比較之下,個人覺得 Zend_Db_Table 比較好用一點,因為他的 where() 函式可以一直串接下去,但 CDbCommand 的 where() 必須先自己依造規則組好,而且只能下一次...(後面下的參數會蓋過前面下的參數)不過在這些 Framework 提供的 Query Builder 的幫助下,能確實減少我們在撰寫 SQL 語法時可能發生的錯誤,同時過濾有可能造成 SQL Injection 的參數。感謝 Framework 製作者的貼心,提供這麼方便的工具^^


arrow
arrow
    創作者介紹
    創作者 danielhuang030 的頭像
    danielhuang030

    danielhuang030 的研究日誌

    danielhuang030 發表在 痞客邦 留言(0) 人氣()