麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 網站 > 建站經驗 > 正文

discuz之C::t 方法

2024-04-25 20:34:37
字體:
來源:轉載
供稿:網友

C::t方法的簡單使用。

一、C::t方法的好處:一是對象清楚,二是對形參格式化處理,三是可集中SQL語句,利于維護,四是安全性更高。

二、具體用法,看下面的例子

假設有一個名為test的插件,其中關于名為tbname的數據表操作的SQL

舊式寫法

a.inc.php

<?php

……

$query = DB::query('select * from '.DB::table('tbname').' where id='.$id);

while($v = DB::fetch($query)){

……

}

……

?>

改造為C::t如下

a.inc.php

<?php

……

$query = C::t('#test#tbname')->fetch_all($id);

foreach($query as $key => $value){

或者將上面的兩行變為一行,以減少行數,如下

foreach(C::t('#test#tbname')->fetch_all($id) as $key => $value){

……

}

……

?>

再新建一個文件夾名為table,放在插件根目錄下,在table中創建一個名為table_tbname.php的類文件(詳見技術文庫的相關說明),該文件的代碼框架如下

table_tbname.php

<?php

if (!defined('IN_DISCUZ')) {

exit('Aecsse Denied');

}

class table_tbname extends discuz_table{

public function __construct() {

$this->_table = 'tbname';

$this->_pk = 'id';

parent::__construct();

}

/*------------在此處構造N多的自定義函數,本例中自定義的函數如下-------------*/

public function fetch_all($id){

return DB::fetch_all('select * from %t where id=%d',array($this->_table,$id));

}

}

?>

C::t的運用有很多變化,但萬變不離其宗,基本骨架就是上面的樣子。

注意:

1、自定義函數中有一個同名函數名fetch_all,雖然名字相同,但內涵不同。本例比較特殊,實際自定義函數名稱你可以隨便起,例如public function ldsjglfdjs($id),不一定非要像技術文庫要求那樣規則命名,當然,規則命名更易于辨認理解維護

2、SQL中應當用格式化語句書寫,以保障安全性,其中的%t代表了對數據表名的格式化,%d代表了對%id的格式化,其中的含義請查詢技術文庫"源DB類的改進",以了解掌握都有哪些格式符及其意義并加以運用。這里要特別注意%s和%i的區別,涉及安全處理問題

3、雖然不是必須,但我仍建議并強調,以數組形參的形式作為DB層封裝函數的第二參數(如果該函數有此參數的話),例如上例中的DB::fetch_all(SQL,array(第一形參,第二形參,...)),某些DB層封裝的函數對于有無$arg這個數組參數有著不同的執行過程,將會影響對該參數中的變量是否進行安全過濾的行為

4、SQL中的格式符一定要和數組形參中的變量一一對應,不能顛倒

5、不提倡舊式的SQL寫法,如DB::fetch_all('select * from '.DB::table('tbname').' where id='.$id),原因見上面的3

6、雖然不是必須,但C::t方法中自定義函數內最好不要使用諸如$_GET、$_POST之類的全局變量,應在C::t之前賦值后傳入,否則,例如在DB::query中使用,如不進行過濾,其安全性將難以保障

7、大多數被DB封裝的常用數據庫操作函數,其參數都將被做安全處理,因此要注意,雖然不是必須避免重復過濾,但應考慮執行效率問題。

8、注意注意再注意,由于大多數被DB封裝的常用數據庫操作函數都要調用內部query函數,相當于在外部直接使用DB::query,而該函數有個特例情況,就是上面3所說,因此特別要考慮有無數組形參,進而加固安全性

9、盡量將SQL集中放在C::t方法的類文件中,避免在應用層等其他文件中使用SQL,這樣能使對象更清晰規范方便維護

官方在source/class/table中已經內置了很多C::t方法,假設在插件設計時所用的方法是官方所沒有的,而官方已創建了一個同名類文件,這時怎么辦?那就按上面例子所示,自己創建一個同名類文件就行了,但應用層一定要用C::t('#插件標識符#不帶前綴的表名')來調用,而不是C::t('不帶前綴的表名')這種方式

閑暇之余多看看source/class/discuz中的discuz_database.php和dizcuz_table.php這兩個重要文件,爛熟其中被DB封裝的常用函數的執行原理和機制,對自如運用C::t和加強安全認識有好處

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产免费一级大片 | 久久99精品久久久久久秒播蜜臀 | 免费午夜视频在线观看 | 亚洲天堂在线电影 | 日本欧美国产 | 久久久久久久久久久影视 | 龙的两根好大拔不出去h | 亚洲第一色片 | 久国产 | 一区二区高清视频在线观看 | 日本一区免费看 | 黑人日比视频 | 久久久裸体视频 | 国产一区二区三区高清 | 一区二区免费网站 | 一级免费在线视频 | 操操操操操 | 日韩视频一区二区在线观看 | 久久成人视屏 | 亚洲va久久久噜噜噜久久男同 | 久久久久久久一区二区 | 精品国产精品久久 | 欧美日韩在线中文 | 国产在线欧美日韩 | 国内精品久久久久久2021浪潮 | 国产日韩大片 | 欧产日产国产精品v | 国产精品美女久久久久久不卡 | 粉嫩一区| 国产精品99久久久久久大便 | 91九色视频观看 | 69性欧美高清影院 | 99精彩视频在线观看 | 国产88久久久国产精品免费二区 | 成人午夜高清 | 97青青草视频 | 国产人妖一区二区 | 国产高潮国产高潮久久久91 | av电影免费在线看 | 亚洲欧美在线视频免费 | 爱高潮www亚洲精品 欧美黄色一级片视频 |