原 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();