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