為了獲取更多最新內(nèi)容及功能更新,請直接訪問我們的首頁以查看DzzOffice筆記的最新地址。
通用接口DB
- addslashes的處理
僅insert()、update()、delete()
方法對傳入其的數(shù)組形式的參數(shù)進(jìn)行intval或addslashes安全處理,字符串形式的參數(shù)將不處理。
- 新添加的方法 fetch_all($sql),order(), limit(),field() 等方法。其中fetch_all方法以數(shù)組方式返回查詢多條記錄數(shù)據(jù),并可設(shè)置數(shù)據(jù)的KEY值使用某字段值;order()、limit()、field()
返回 SQL 語句中相應(yīng)的部分。
- SQL 語句 format 的支持
$arr = DB::fetch_all('SELECT * FROM %t WHERE uid>%d LIMIT %d', array('user', '100', '20'), 'uid');
%t | DB::table() |
%d | intval() |
%s | addslashes() |
%n | in IN (1,2,3) |
%f | sprintf('%f', $var) |
%i | 直接使用不進(jìn)行處理 |
建議所有的查詢語句都使用上述格式方式,以增強(qiáng)安全性。
- 返回值的處理
在非UNBUFFERED的情況下:INSERTSQL 語句返回insert_id();UPDATE和DELETESQL 語句返回affected_rows()
- 常用操作符(具體實(shí)現(xiàn)代碼查看./core/class/dzz/dzz_database.php)
- DB::table($table) 返回完整的表名稱供查詢使用,其中$table為不帶表前綴的表名;
- DB::limit($start,$limit=0) 返回mysql查詢的limit限定條件;
- DB::order($field, $order = 'ASC') 返回mysql查詢的order by限定條件;
- DB::field($field, $val, $glue = '=') 根據(jù)$glue值返回mysql查詢的where限定條件,$glue可用值:=、+、-、|、&、^、>、<、<>、<=、>=、like、in、notin;
- DB::fetch_all($sql, $arg = array(), $keyfield = '', $silent=false) 數(shù)組方式返回查詢多條記錄數(shù)據(jù),并可設(shè)置數(shù)據(jù)的KEY值使用某字段值;
- DB::fetch_first($sql, $arg = array(), $silent = false) 數(shù)組方式返回一條記錄;
- DB::result_first($sql, $arg = array(), $silent = false) 返回一條記錄的第一個(gè)字段的值;
- DB::query($sql, $arg = array(), $silent = false, $unbuffered = false) 通用查詢語言,返回查詢結(jié)果;
- DB::insert($table, $data, $return_insert_id = false, $replace = false, $silent = false) 插入一條數(shù)據(jù);
- DB::delete($table, $condition, $limit = 0, $unbuffered = true) 根據(jù)$condition刪除符合條件的記錄;
- 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_';
$this->_cache_ttl =0; 緩存時(shí)間,以秒為單位,0表示永久或相關(guān)配置文件中的默認(rèn)值
parent::__construct();
}
注意:開啟表緩存后,所有數(shù)據(jù)的更新、插入和刪除都需要更新相關(guān)的緩存(使用基類的更新操作會自動(dòng)更新緩存)。
更多建議: