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 製作者的貼心,提供這麼方便的工具^^
文章標籤
全站熱搜
留言列表