數(shù)據(jù)庫層

2024-07-17 23:44 更新

為了獲取更多最新內(nèi)容及功能更新,請直接訪問我們的首頁以查看DzzOffice筆記的最新地址。

通用接口DB

  1. addslashes的處理

insert()、update()delete()

方法對傳入其的數(shù)組形式的參數(shù)進(jìn)行intvaladdslashes安全處理,字符串形式的參數(shù)將不處理。

  1. 新添加的方法 fetch_all($sql),order(), limit(),field() 等方法。其中fetch_all方法以數(shù)組方式返回查詢多條記錄數(shù)據(jù),并可設(shè)置數(shù)據(jù)的KEY值使用某字段值;order()、limit()、field()

返回 SQL 語句中相應(yīng)的部分。

  1. SQL 語句 format 的支持
//例:查詢20個(gè)用戶uid大于100的用戶數(shù)據(jù),以uid為返回結(jié)果數(shù)組的key $arr = DB::fetch_all('SELECT * FROM %t WHERE uid>%d LIMIT %d', array('user', '100', '20'), 'uid');
  • 支持的fomat有:
%tDB::table()
%dintval()
%saddslashes()
%nin IN (1,2,3)
%fsprintf('%f', $var)
%i直接使用不進(jìn)行處理

建議所有的查詢語句都使用上述格式方式,以增強(qiáng)安全性。

  1. 返回值的處理

在非UNBUFFERED的情況下:INSERTSQL 語句返回insert_id();UPDATEDELETESQL 語句返回affected_rows()

  1. 常用操作符(具體實(shí)現(xiàn)代碼查看./core/class/dzz/dzz_database.php)
  1. DB::table($table) 返回完整的表名稱供查詢使用,其中$table為不帶表前綴的表名;
  2. DB::limit($start,$limit=0) 返回mysql查詢的limit限定條件;
  3. DB::order($field, $order = 'ASC') 返回mysql查詢的order by限定條件;
  4. DB::field($field, $val, $glue = '=') 根據(jù)$glue值返回mysql查詢的where限定條件,$glue可用值:=、+、-、|、&、^、>、<、<>、<=、>=、like、in、notin;
  5. DB::fetch_all($sql, $arg = array(), $keyfield = '', $silent=false) 數(shù)組方式返回查詢多條記錄數(shù)據(jù),并可設(shè)置數(shù)據(jù)的KEY值使用某字段值;
  6. DB::fetch_first($sql, $arg = array(), $silent = false) 數(shù)組方式返回一條記錄;
  7. DB::result_first($sql, $arg = array(), $silent = false) 返回一條記錄的第一個(gè)字段的值;
  8. DB::query($sql, $arg = array(), $silent = false, $unbuffered = false) 通用查詢語言,返回查詢結(jié)果;
  9. DB::insert($table, $data, $return_insert_id = false, $replace = false, $silent = false) 插入一條數(shù)據(jù);
  10. DB::delete($table, $condition, $limit = 0, $unbuffered = true) 根據(jù)$condition刪除符合條件的記錄;
  11. DB::update($table, $data, $condition, $unbuffered = false, $low_priority = false) 更新符合條件的記錄。

數(shù)據(jù)表模型C::t

DzzOffice可以使用數(shù)據(jù)層來操作數(shù)據(jù)表。使用數(shù)據(jù)層具有以下優(yōu)點(diǎn):

  • 結(jié)構(gòu)清晰,便于閱讀。
  • 對查詢參數(shù)進(jìn)行格式化處理,增強(qiáng)了安全性。
  • 集中數(shù)據(jù)操作sql語句,便于維護(hù)和更新。
  • 實(shí)現(xiàn)緩存操作的相關(guān)函數(shù),解決MYSQL自身對高并發(fā)處理的性能瓶頸。

使用數(shù)據(jù)層需要滿足以下條件:

  • 具有以table_加上不帶前綴的表名的class文件。
  • 操作類class_表名的類繼承dzz_table基類。

數(shù)據(jù)層的規(guī)范和約定

  • 一個(gè)數(shù)據(jù)表對應(yīng)一個(gè)class文件,以table_加上不帶前綴的表名命名,盡量不操作其它表;
  • 使用C::t('tablename')->method()調(diào)用;
  • 不建議使用$_G、$_POST、$_GET等全局變量(可以以參數(shù)形式帶入或者使用getglobal來獲取全局變量);
  • 關(guān)聯(lián)查詢(JOIN)盡量拆分為單條查詢,不能拆分的放入主表的類中;
  • 方法名以下劃線分隔,全部為小寫,全部為單數(shù),直接返回結(jié)果,保留關(guān)鍵字:on、get、set。方法參數(shù)不能以數(shù)組的形式傳入,數(shù)據(jù)可以;
  • 除數(shù)據(jù)表文件以外,其它文件盡量不要出現(xiàn)SQL語句,便于后續(xù)的數(shù)據(jù)表的維護(hù)和更新;
  • 建議方法名:查詢結(jié)果返回一行記錄方法名使用fetch開頭,返回多行記錄方法名使用fetch_all開頭,查詢中使用SQL語句count函數(shù)返回一個(gè)數(shù)值的使用count開頭;
  • 方法名中by后面的是以下劃線(_)分隔的表字段名,不要使用復(fù)數(shù)型,例如: fetch_all_by_uid()而不是fetch_all_by_uids();
  • 方法名需去掉表名,如:dzz_table表類方法 fetch_table_by_all應(yīng)命名為fetch_all;
  • 數(shù)據(jù)表類繼承dzz_table基類,基類實(shí)現(xiàn)CURD操作,fetch方法實(shí)現(xiàn)了根據(jù)一個(gè)主鍵 值得到一行記錄、fetch_all方法實(shí)現(xiàn)了根據(jù)一組主鍵值得到多行記錄(二維數(shù)據(jù),主鍵值為 key)、count方法返回了表的總記錄數(shù)據(jù);
  • 如果表是無主鍵或是關(guān)聯(lián)主鍵,則基類中的CURD將不能使用,需自己在相應(yīng)的表類中實(shí)現(xiàn), 同時(shí)將$this->_pk設(shè)置為空;
  • DB層封裝的函數(shù)實(shí)現(xiàn)了addslashes,個(gè)別直接寫sql語句的需注意addslashes;
  • C::t插件調(diào)用方式
表名:dzz_table 目錄:dzz/test/class/table/table_test.php 類名:table_test 用法:C::t('test') ->method();
  • 基類實(shí)現(xiàn)緩存操作的相關(guān)函數(shù),數(shù)據(jù)表類中增加下面的參數(shù)來啟用數(shù)據(jù)緩存(需要服務(wù)器開啟緩存),例如:
public function __construct() { $this->_table = 'app_open'; $this->_pk = 'extid'; $this->_pre_cache_key = 'app_open_';//緩存主鍵名前綴,為空時(shí)表示此表不支持緩存 $this->_cache_ttl =0; 緩存時(shí)間,以秒為單位,0表示永久或相關(guān)配置文件中的默認(rèn)值 parent::__construct(); }

注意:開啟表緩存后,所有數(shù)據(jù)的更新、插入和刪除都需要更新相關(guān)的緩存(使用基類的更新操作會自動(dòng)更新緩存)。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號