AB模板網:專注于dede模板,織夢源碼,織夢模板,網站模板下載,dedecms模板,網站源碼,dedecms教程以及各類手機網站模板和企業網站模板分享.

織夢模板

網站模板搜索
營銷型模板 政府網站模板 自適應模板 標簽大全

注冊

discuz教程:插件開發經驗之如何運用 C::t 方法

網站模板下載 www.96324751.buzz / 2014-12-30
抽點時間講解一下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和加強安全認識有好處
本文由AB模板網整理發布,轉載請說明出處:http://www.96324751.buzz/discuzjc/653.html
本文標簽:

有問題可以加入織夢技術QQ群一起交流學習

☉首先聲明,只要是我們的vip會員全站所有資源均可以免費下載,不做任何限制(了解更多)

☉本站的源碼不會像其它下載站一樣植入大量的廣告。

☉本站提供的織夢源碼,都是做好測試好發布的,均可放心使用。

☉本站提供的織夢源碼,均帶數據及演示地址。可以在任一源碼詳情頁查看演示地址。

☉為了vip利益的最大化,我們還提供了vip贈品(了解更多

☉如有其他問題,請加網站客服QQ(9490489)進行交流。

相關教程

織夢模板_隨機Tags

教育網站模板 戶外拓展網站模板 床墊網站模板 貨運公司網站模板 HTML5運營資訊模板網站模板 口紅網站模板 熱水器網站模板 住宿網站模板 小程序開發網站模板 店鋪裝修網站模板 家裝設計網站模板 手機網站模板

推薦教程

首頁 VIP專區 靜態模板 會員中心
河南22选5啥时开奖 24小时娱乐城 广东11选5最聪明的玩法 河北十一选五遗漏统计 湖北快3开奖号 11旺娱乐城网络百家乐 江西时时彩中奖技巧 10.2体彩排列3试机号 安徽11选五开奖走势图 一定牛 股票分析师考试 湖北十一选五下注 4887香港铁算资料开奖小说 时时彩时间改在20分一期 互联网理财平台 福建快三遗漏基本走势图 北京快三开奖号码查询 北京快乐8开奖网站