原 DB 類的改進
Discuz! X2.5 新版對資料庫 DB 層進行了功能和安全方面的加強:
- addslashes 的處理
僅 insert(),update(),delete() 方法對傳入其的陣列形式的引數進行 intval 或 addslashes 安全處理,字串形式的引數將不處理,請注意
- 新新增的方法 fetch_all($sql),order(), limit(),field() 等方法
其中 fetch_all 方法以陣列方式返回查詢多條記錄資料,且可以設定資料的 KEY 值使用某欄位值;
order(),limit(),field() 返回 SQL 語句中相應的部分
- SQL 語句 format 的支援
//例:查詢 10 個使用者 uid 大於 100 的使用者資料,以 uid 為返回結果陣列的 key
$arr = DB::fetch_all('SELECT * FROM %t WHERE uid>%d LIMIT %d', array('common_member', '100', '10'), 'uid');
支援的 fomat 有:
| %t | DB::table() |
| %d | intval() |
| %s | addslashes() |
| %n | in IN (1,2,3) |
| %f | sprintf('%f', $var) |
| %i | 直接使用不進行處理 |
- 返回值的處理
在非 UNBUFFERED 的情況下:INSERT SQL 語句返回 insert_id();UPDATE 和 DELETE SQL 語句返回 affected_rows()
新增資料層:資料層的規範和約定
- 一個資料表一個 class 檔案,以 table_加上不帶字首的表名命名,儘量不操作其它表;
- 不能使用 $_G 、 $POST 、 $GET 等全域性變數;
- 關聯查詢 (JOIN) 儘量拆分為單條查詢,不能拆分的放入主表的類中;
- 方法名以下劃線分隔,全部為小寫,全部為單數,直接返回結果,保留關鍵字:on 、 get 、 set, 方法引數不能以陣列的形式傳入,資料可以;
- 除資料表檔案以外,其它檔案禁止出現 SQL 語句;
- 查詢結果返回一行記錄方法名使用 fetch 開頭,返回多行記錄方法名使用 fetch_all 開頭,查詢中使用 SQL 語句 count 函式返回一個數值的使用 count 開頭;
- 方法名中 by 後面的是以下劃線 (_) 分隔的表欄位名,不要使用複數型,例如: fetch_all_by_uid() 而不是 fetch_all_by_uids();
- 方法名需去掉表名,如:common_member 表類方法 fetch_member_by_username 應命名為 fetch_by_username;
- 資料表類繼承 discuz_table 基類,基類實現 CURD 操作,fetch 方法實現了根據一個主鍵 值得到一行記錄、 fetch_all 方法實現了根據一組主鍵值得到多行記錄 (二維資料,主 鍵值為 key) 、 count 方法返回了表的總記錄資料;
- 如果表是無主鍵或是關聯主鍵,則基類中的 CURD 將不能使用,需自己在相應的表類中實現, 同時將 $this->_pk 設定為空;
- DB 層封裝的函式實現了 addslashes,個別直接寫 sql 語句的需主意 addslashes;
- 使用 C::t('tablename')->method(); 呼叫;
- C::t 外掛呼叫方式
表名:mytablename
目錄:source/plugin/mypluginid/table/table_mytablename.php
類名:table_mytablename
用法:C::t('#mypluginid#mytablename')->method();