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