thinkphp開發技巧經驗分享

thinkphp開發技巧經驗分享

www.111cn.net 編輯:flyfox 來源:轉載
這裏我給你們總結一個朋友學習thinkphp時的一些筆記了,從變量到內置模板引擎及系統變量等等的筆記了,同時還有一些開發中碰到的問題的解決方案下面咱們一塊兒來看看吧。
 
 

一,經常使用的系統變量php

(1)系統變量:在模板中輸出系統變量:包括server、env、session、post、get、request、cookie     html

{$Think.server.script_name} // 輸出$_SERVER變量web

{$Think.session.session_id|md5} // 輸出$_SESSION變量 sql

{$Think.get.pageNumber} // 輸出$_GET變量 thinkphp

{$Think.cookie.name}  // 輸出$_COOKIE變量數據庫

以上方式還能夠寫成:數組

{$_SERVER.script_name} // 輸出$_SERVER變量 
  
{$_SESSION.session_id|md5} // 輸出$_SESSION變量 緩存

{$_GET.pageNumber} // 輸出$_GET變量 cookie

{$_COOKIE.name}  // 輸出$_COOKIE變量session

系統常量 :使用$Think.const 輸出

注意:server、cookie、config不區分大小寫,可是變量區分大小寫。例如:

{$Think.server.script_name}和{$Think.SERVER.script_name}等效

SESSION 、COOKIE還支持二維數組的輸出

例如:

{$Think.CONFIG.user.user_name}

{$Think.session.user.user_name}

系統不支持三維以上的數組輸出。
 
  
(2)語言變量:輸出項目的當前語言定義值

{$Think.lang.page_error}

{$Think.const.MODULE_NAME}

或者直接使用

{$Think.MODULE_NAME}
 
(3)特殊變量 :由ThinkPHP系統內部定義的常量

{$Think.version}  //版本

{$Think.now} //如今時間  

{$Think.template|basename} //模板頁面  

{$Think.LDELIM} //模板標籤起始符號  

{$Think.RDELIM} //模板標籤結束符號
 
(4)配置參數 :輸出項目的配置參數值

{$Think.config.db_charset}

輸出的值和 C('db_charset') 的結果是同樣的。

(5)thinkphp 的系統常量(注意如下常量也能夠直接在 action 控制器中直接使用)

__ROOT__ // 網站根目錄地址

__APP__ // 當前項目(入口文件)地址

__URL__ // 當前模塊地址

__ACTION__ // 當前操做地址

__SELF__ // 當前 URL 地址

__PUBLIC__ // 網站公共目錄


二,查詢技巧


1、帶where條件的普通查詢
   
一、字符串形式

 代碼以下 複製代碼

$user=M('user');
$list=$user->where('id>5 and id<9')->select();
$list=$user->where($data)->select();

二、數組形式

 代碼以下 複製代碼

$user=M('user');
$list=$user->where(array('username'=>'www.111cn.Net'))->select();
$list=$user->where($data)->select();

三、對象形式

 代碼以下 複製代碼

$user=M('user');
$a=new stdClass();
$a->username='www.111cn.Net';
$list=$user->where($a)->select();  

四、查詢表達式

EQ              等於
NEQ             不等於
GT              大於
EGT             大於等於
LT              小於
ELT             小於等於
LIKE            等價與sql中的like
[NOT] BETWEEN   查詢區間
[NOT] IN        查詢集合
EXP             指使用標準SQL語句,實現更加複雜的狀況

語法格式:$data['字段名']=array('是表達式','查詢條件');

例如

$data['username']='www.111cn.Net';

其實是指

 代碼以下 複製代碼

$data['username']=array('eq','www.111cn.Net');

$data['username']=array('like','peng%');
$list=$user->where($data)->select();

$data['username']=array(array('like','p%'),array('like','h%'),'or');
$list=$user->where($data)->select();

2、區間查詢

 代碼以下 複製代碼

$user=M('user');
$data['id']=array(array('gt',20),array('lt',23),'and');
$list=$user->where($data)->select();

3、組合查詢

 代碼以下 複製代碼

$user=M('user');
$data['username']='pengyanjie';
$data['password']=array('eq','pengyanjie');
$data['id']=array('lt',30);
$data['_logic']='or';
$list=$user->where($data)->select();
dump($list);

4、複合查詢

 代碼以下 複製代碼

$user=M('user');
$data['username']=array('eq','pengyanjie');
$data['password']=array('like','p%');
$data['_logic']='or';
$where['_complex']=$where;
$where['id']=array('lt',30);
$list=$user->where($data)->select();

至關於

(id<30) and ((username=pengyanjie) or (password like p%))

5、統計查詢

 代碼以下 複製代碼

echo $user->count();
echo '<br>';
echo $user->max('id');
echo '<br>';
echo $user->where('id<30')->min('id');
echo '<br>';
echo $user->avg('id');
echo '<br>';
echo $user->sum('id');

6、定位查詢

 代碼以下 複製代碼

$user=new AdvModel('user');//實例化高級模型AdvModel
//$user=M('user','CommonModel');//或者將AdvModel用CommonModel來繼承
$list=$user->order('id desc')->getN(2);//返回結果中的第三條
$list=$user->order('id desc')->last();//返回最後一條
$list=$user->order('id desc')->first();//返回第一條

7、SQL查詢

excute()主要用於更新和寫入

 代碼以下 複製代碼

$Model=new Model()  //  實例化一個 model 對象,沒有對應任何數據表
$Model->execute("update think_user set name='thinkPHP' where status=1");

query()主要用於查詢   

 代碼以下 複製代碼

$user=M();
$list=$user->query('select * from aoli_user order by id desc');
dump($list);          

8、動態查詢

 代碼以下 複製代碼

$user=M('user');
$list=$user->getByusername('pengyanjie');
$list=$user->getByusername('pengyanjie');

$user=new AdvModel('user');
$list=$user->top5();//前5條

三,內置模板引擎的使用方法總結

(1)下面是控制器 IndexAction 類的源碼

 代碼以下 複製代碼

<?php
class IndexAction extends Action{
    public function index() {
        $_SESSION['name']    =    'ThnkPHP Session';
        $vo    =    array('id'=>1,'name'=>'ThinkPHP','email'=>'liu21st@gmail.com');
        $this->assign('vo',$vo);
        $obj    =    (object)$vo;
        $this->assign('obj',$obj);
        $this->assign('array',array(5,260,13,7,40,50,2,1));
        $this->assign('num1',6);
        $this->assign('num2',2);
        $this->assign('num',6);
        $this->display();
    }

?>


(2)如下演示的是上面控制器賦值到模板中的一些變量,常量以及數組的一些基礎性用法

廣泛變量輸出

 代碼以下 複製代碼

num1:{$num1}

對象輸出

 代碼以下 複製代碼

id:{$obj:id}

name:{$obj:name}

數組輸出

 代碼以下 複製代碼

id:{$vo['id']}

name:{$vo['name']}

自動判斷數組和對象輸出

 代碼以下 複製代碼

id:{$vo.id}

name:{$vo.name}

系統常量輸出(系統常量能夠不用在控制器中使用 assign 賦值)

 代碼以下 複製代碼

{$Think.now|date='Y-m-d H:i:s',###}

{$Think.server.PHP_SELF}

{$Think.session.name}

對變量使用函數(這裏能夠是內置函數或者自定義函數)

{$vo.name|strtolower|ucwords}

Foreach 輸出

<foreach name="vo" key="key" item="item">
{$key}:{$item}
</foreach>

下面這個例子使用了循環標籤、Switch標籤、比較標籤

 代碼以下 複製代碼

<volist name="array" id="val" key="i">
[{$i}]
<eq name="odd" value="1">偶數行</eq>
<eq name="odd" value="0">奇數行</eq>
<gt name="val" value="5">{$val}大於5</gt>
<if condition=" $val gt 15"> 
{$val}大於15
<elseif condition="$val lt 10" />
{$val}小於10
</if>
<switch name="val">
<case value="1">數據{$val}</case>
<case value="2">數據{$val}</case>
<case value="3">數據{$val}</case>
<default />其餘數據是 {$val}
</switch>
</volist>

輸出結果相似爲:

[1] 奇數行 5小於10 長度爲1
[2] 偶數行 260大於5 260大於15 長度爲3
[3] 奇數行 13大於5 長度爲2
[4] 偶數行 7大於5 7小於10 長度爲1
[5] 奇數行 40大於5 40大於15 長度爲2
[6] 偶數行 50大於5 50大於15 長度爲2
[7] 奇數行 2小於10 長度爲1
[8] 偶數行 1小於10 長度爲1

ThinkPHP內置的模板引擎比較標籤

<gt name="num1" value="3">大於3</gt>
<lt name="num2" value="3">小於3</lt>

輸出結果相似爲:

大於3
小於3
條件判斷

 代碼以下 複製代碼

<if condition=" $num gt 5">
{$num}大於5
<elseif condition="$num gt 3" />
{$num}大於3<else />
其餘{$num}
</if>

輸出結果相似爲:

6大於5

4、thinkphp開發技巧總結

使用thinkphp作開發的過程當中的一些技巧總結,之後發現了還會繼續補充,也歡迎更多的朋友在下面留言補充。

(1)不要在模板中直接使用{$_GET.id}或者{$Think.get.id},由於{$_GET.id} {$Think.get.id} 這兩種方式都沒有任何過濾,容易被XSS。建議使用I方法,即:{:I('get.id')}

(2)在thinkphp中若是須要獲取數據庫中某個表的字段該怎麼辦呢?示例以下:

 $user=M('user'); 

2 $fields=$user->getDbFields(); 
結果將返回一個由表字段組成的一個一維數組。

(3)數據修改的過程當中若是咱們只須要修改某個字段的值,就可使用setField方法,而不須要每次都調用save方法,例如:

 $user=M('user'); 

2 $user->where('id=2')->setField('username','www.111cn.Net'); 
(4)涉及到比較的狀況下不必定非得使用if condition這種形式的,還能夠按以下的形式來寫:

 <eq name="web" value="phpernote">value</eq> // name 變量的值等於 phpernote 就輸出 

2 <neq name="web" value="phpernote">value</neq> // name 變量的值不等於 phpernote 就輸出 

3 <gt name="age" value="5">value</gt> // name 變量的值大於 5 就輸出 

4 <egt name="age" value="5">value</egt> // name 變量的值大於等於 5 就輸出 

5 <lt name="age" value="5">value</lt> // name 變量的值小於 5 就輸出 

6 <elt name="age" value="5">value</elt> // name 變量的值小於等於 5 就輸出 
(5)在thinkphp的刪除操做中能夠不使用where直接使用delete來執行刪除,例如:

 $User->delete('2,5');//刪除主鍵爲2和5的數據 
(6)關於thinkphp的幾個快速操做的函數的用法說明。

C操做,操做(動態)配置: 主要用於Action方法裏面

獲取:C('配置參數')

設置:C('配置參數 ',新值)

A操做,快速建立Action對象:

$action=A('User'); 等效於 $action=new UserAction();

D操做,快速建立模型數據對象:

$model=D('User'); 等效於 $model=new UserModel();

S操做,快速操做緩存方法

獲取:S('name')

設置:S('name','value');

刪除:S('name',NULL);

F操做,快速文件數據保存方法,使用方法與S操做同樣。

(7)Model命名時,默認要和數據庫裏的表名一致,如PhpernoteUserModel.class.php對應數據庫的名稱應該是 '前綴_phpernote_user',在程序代碼中的調用應該是:D('PhpernoteUser');

(8)開發的過程當中如不須要進行緩存,能夠在入口文件中進行以下定義:

 define('NO_CACHE_RUNTIME',true); 
(9)在開發的過程當中若是須要知道一些額外的信息,可在配置文件中進行相應的定義,下面給出幾個比較常見的信息定義方式:

 'SHOW_RUN_TIME'=>true,//運行時間顯示 

2 'SHOW_ADV_TIME'=>true,//顯示詳細的運行時間 

3 'SHOW_DB_TIMES'=>true,//顯示數據庫的操做次數 

4 'SHOW_CACHE_TIMES'=>true,//顯示緩存操做次數 

5 'SHOW_USE_MEM'=>true,//顯示內存開銷 
(10)自定義Model類並在實例化模型(模型就是數據庫操做類)時使用,舉例以下:

a、在工程目錄下的Lib目錄下的Model目錄下創建一個IndexModel.class.php,而後裏面寫一個方法play,此方法內容體爲循環輸出1至10。

b、那麼在Action中的方法裏,還能夠這麼寫:

 $index=M('index','IndexModel');//這裏能夠加上自定義的模型類一塊兒實例化 

2 $index->play(); 
那麼會輸出1至10。

(11)使用thinkphp的過程當中若是須要更改默認的模板後綴名,能夠在配置文件中作以下定義:

 'TMPL_TEMPLATE_SUFFIX' => '.dwt'//這裏就將模板後綴名改成了dwt


thinkphp自動驗證與自動填充無效總結

(1)create() 方法有問題

ThinkPHP 自動驗證與自動填充是在建立數據對象 create() 時實現的,所以自動驗證與自動填充無效很大程度上與 create() 有關。

create 方法語法以下:

create(mixed data, string type)

data 表示接受的數據,type 表示本次的具體操做(寫入仍是更新數據)。兩個參數均可省略,data 參數省略的狀況下默認爲接受 $_POST 數據,而 type 默認狀況下由系統自動識別。

但系統自動識別 type 是有缺陷的,當傳入的字段有主鍵字段時,系統就識別爲更新操做,不然就是寫入操做。因此當主鍵字段非自動增加而是須要 SQL 寫入時,那麼自動驗證和自動填充均可能無效。

例如添加數據記錄時,若是表單中有主鍵字段或者系統中產生了主鍵字段(如錄入設備編號),那麼 ThinkPHP 就認爲本次操做爲更新操做,對於例以下面設定的自動驗證和填充都會略過:

 代碼以下 複製代碼

protected $_validate = array(

// 新增時驗證標題惟一

array('title','','標題已經存在!',0,'unique',1),

};

// 自動填充

protected $_auto = array(

// 新增時填充時間戳

array('pubtime','time',1,'function'),

);

儘管在操做中,執行了 add() 操做將數據寫入了數據表,但這時會發現自動驗證與自動填充無效。

出現這種狀況時,只需將操做類型顯式的傳入 create() 方法便可,即 create($_POST,1),告訴系統本次操做爲寫入數據。另外若是傳入的數據不是 $_POST ,也要將數據看成參數傳入,如 create($_GET)。

(2)數據字段未對應

因爲粗心,未對應好表單字段與數據表字段。

(3)數據表字段作了更改

在開發過程當中,更改了表字段名稱,而緩存未及時更新,致使系統判斷爲無效字段而被 unset 掉。因此在更改了表字段名稱以後,及時將 Runtime/Data 下的數據表緩存清除。

(4)Model 命名錯誤

Model 命名錯誤,未嚴格按照規範命名,如頭字母未大寫或粗心致使字母順序不對,多或少字母等。這等錯誤每每會直接致使模型失效,大小寫這邊特別須要注意。

(5)數據表無自增的id

就是數據表中沒有自增的id時,驗證時就會找不到須要驗證的數據,因此會失敗。

以上就是ThinkPHP自動驗證與自動填充無效可能出現的幾種緣由,當出現問題時要一條一條的進行排除,相信本身必定能夠找到錯誤的,固然還有一些未知的錯誤,若是您發現了另外的一種緣由,請在下方留言指正。

相關文章
相關標籤/搜索