一,經常使用的系統變量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'); |
二、數組形式
代碼以下 | 複製代碼 |
$user=M('user'); |
三、對象形式
代碼以下 | 複製代碼 |
$user=M('user'); |
四、查詢表達式
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%'); $data['username']=array(array('like','p%'),array('like','h%'),'or'); |
2、區間查詢
代碼以下 | 複製代碼 |
$user=M('user'); |
3、組合查詢
代碼以下 | 複製代碼 |
$user=M('user'); |
4、複合查詢
代碼以下 | 複製代碼 |
$user=M('user'); 至關於 (id<30) and ((username=pengyanjie) or (password like p%)) |
5、統計查詢
代碼以下 | 複製代碼 |
echo $user->count(); |
6、定位查詢
代碼以下 | 複製代碼 |
$user=new AdvModel('user');//實例化高級模型AdvModel |
7、SQL查詢
excute()主要用於更新和寫入
代碼以下 | 複製代碼 |
$Model=new Model() // 實例化一個 model 對象,沒有對應任何數據表 |
query()主要用於查詢
代碼以下 | 複製代碼 |
$user=M(); |
8、動態查詢
代碼以下 | 複製代碼 |
$user=M('user'); $user=new AdvModel('user'); |
三,內置模板引擎的使用方法總結
(1)下面是控制器 IndexAction 類的源碼
代碼以下 | 複製代碼 |
<?php |
(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"> |
輸出結果相似爲:
[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"> |
輸出結果相似爲:
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自動驗證與自動填充無效可能出現的幾種緣由,當出現問題時要一條一條的進行排除,相信本身必定能夠找到錯誤的,固然還有一些未知的錯誤,若是您發現了另外的一種緣由,請在下方留言指正。