文章出處

三. 跳轉和重定向

ThinkPHP 在操作數據庫時,需要跳轉和重定向頁面。ThinkPHP 提供了一組方法來解
決了這個問題。

在 WeiBo/Home/Controller/UserController.class.php 中的代碼如下:


 1 <?php
 2 
 3 namespace Home\Controller;
 4 use Think\Controller;
 5 
 6 class UserController extends Controller {
 7         public function index() {
 8             $flag=ture;
 9             if($flag) {
10                 //會跳轉到:http://localhost/demo39/User/all
11                  $this->success('跳轉成功','./User/all');
12              }else {
13                  //會跳轉到本頁的上一頁
14                  $this->error('跳轉失敗');
15              }
16         }    
17         public function all() {
18             echo "這里是跳轉的頁面";
19         }
20 }

在瀏覽器的地址欄輸入: http://localhost/demo39/User/ 后出現如下圖:

3秒過后:

注意:在 $this->error('跳轉失敗'); 中發現跳轉失敗后,會跳轉到前一個頁面,此時,如果前一個頁面是 www.baidu.com ,

然后在上面的代碼中的 $flag=false; 然后在瀏覽器的地址欄中輸入 http://localhost/demo39/User/ ,然后它跳轉到的

頁面是 www.baidu.com 。

PS:success()方法和 error()方法,第一個參數是提示信息、第二個跳轉的地址、
第三個跳轉時間。默認情況下 success()方法是 1 秒,error()方法是 3 秒。

1 //設置5秒
2 $this->success('新增成功!', 'list', 5);

 

success()方法和 error()方法,跳轉的時候就對應了相應的模版,默認如下:

1 //默認錯誤跳轉對應的模板文件
2 'TMPL_ACTION_ERROR' =>THINK_PATH .'Tpl/dispatch_jump.tpl',
3 //默認成功跳轉對應的模板文件
4 'TMPL_ACTION_SUCCESS'=>THINK_PATH.'Tpl/dispatch_jump.tpl',

 Tpl/dispatch_jump.tpl 的路徑為: WeiBo/ThinkPHP/Tpl/dispatch_jump.tpl 

自定義成功和錯誤提示模版頁面

在 WeiBo/Common/Conf/config.php 中配置:

1 'TMPL_ACTION_SUCCESS'=>'Public/success',
2 'TMPL_ACTION_ERROR'=>'Public/error',

此時,引用的 Public/success 文件在 WeiBo/Home/View/Public/success.html 下;

這時 success.html 里的跳轉函數以及定時函數可參考 dispatch_jump.tpl 中的代碼來編寫;

 

對于自定義的提示模版,ThinkPHP 提供了一組變量可供使用。

變量 含義
$msgTitle 操作標題
$message 頁面提示信息
$status 操作狀態 1 表示成功 0 表示失敗
$waitSecond  跳轉等待時間,單位為秒
$jumpUrl  跳轉頁面地址

 

 

//模版中使用提示變量
操作標題:{$msgTitle}<br />
頁面提示信息:{$message}<br />
操作狀態:{$status}<br />
跳轉等待時間:{$waitSecond}<br />
頁面跳轉地址:{$jumpUrl}

 

PS:如果對于數據庫操作,采用了 Ajax 方式,那么 success()和 error()會自動
ajaxReturn()方法返回數據提供調用。

ThinkPHP 還單獨提供了重定向方法 redirect(),參數和 U()方法一樣。這個方法使
用的是 URL 規則。

1 $this->redirect('User/test',  array('id'=>5), 5, '頁面跳轉中...');

如果只是想純粹的 URL 跳轉,不去使用 URL 規則,那么直接使用 redirect()函數。

1 redirect('http://www.baidu.com', 5, '頁面跳轉中...');

 

四. 輸入變量

 

我們在獲取系統變量或者用戶提交的數據時,這些變量數據錯綜復雜,一不小心就容易
引擎安全隱患,所以,ThinkPHP 提供了輕松和安全獲取變量的解決方案。

1 //常規獲取變量方式
2 $id = $_GET['id']; //獲取get變量
3 $name = $_POST['name']; //獲取post變量
4 $value = $_SESSION['var']; //獲取session變量
5 $name = $_COOKIE['name']; //獲取cookie變量
6 $file = $_SERVER['PHP_SELF']; //獲取 server 變量

在 WeiBo/Home/Controller/UserController.class.php 中代碼如下所示:

 1 <?php
 2 
 3 namespace Home\Controller;
 4 use Think\Controller;
 5 
 6 class UserController extends Controller {
 7         public function index($id,$type) {
 8             echo 'id:'.$id.',type:'.$type;
 9             
10         }
11 }

這時因為在 WeiBo/Common/Conf/config.php 中配置了 'URL_PARAMS_BIND_TYPE'=>1, 所以在瀏覽器地址中輸入: http://localhost/demo39/user/index/2/3 

得到 id:2,type:3 ,如果去掉在 WeiBo/Common/Conf/config.php 中對url中元素順序的綁定,這時在地址欄中輸入 http://localhost/demo39/user/index/2/3  

會出現:

這時在地址欄必須輸入: http://localhost/demo39/user/index/id/2/type/3 才能得到 id:2,type:3 

PS:在 ThinkPHP 中,我們不再建議直接使用傳統方式獲取,因為沒有統一的安全處理
機制,后期調整也會比較麻煩。所以,ThinkPHP 提供 I()方法進行變量的獲取和過濾。

I()方法的格式:I('變量類型.變量名',['默認值'],['過濾方法'])

 

變量類型 含義
get 獲取 GET 參數
post 獲取 POST 參數
param  自動判斷請求類型獲取 GET、POST 或者 PUT 參數
request  獲取 REQUEST 參數
put 獲取 PUT 參數
session  獲取$_SESSION 參數
cookie  獲取$_COOKIE 參數
server  獲取$_SERVER 參數
globals  獲取$GLOBALS 參數

在 WeiBo/Home/Controller/UserController.class.php 中寫入如下代碼:

 1 <?php
 2 
 3 namespace Home\Controller;
 4 use Think\Controller;
 5 
 6 class UserController extends Controller {
 7         public function index() {
 8             echo I('get.id');            
 9         }
10 }

在瀏覽器地址欄中輸入: http://localhost/demo39/user/index/id/2 ,輸出為:2

如果沒有在 config.php 中配置 'URL_PARAMS_BIND_TYPE'=>1, 則url中的id不能省去。

1 //$_GET['id']沒有值,則默認1
2  echo I('get.id', 1);
1 //過濾$_GET['id']
2  echo I('get.id', '', 'md5');

此時輸出用md5加密的 get.id 值。

1 //獲取$_GET;
2 print_r(I('get.'));

PS:其他幾個系統變量均采用以上方式

 

ThinkPHP 還提供了一個自動識別各種系統變量類型的接受方法:param

1 //param變量自動判斷變量類型
2  echo I('param.id');
3 //param可以省略
4  echo I('id');

 

如果是 PATHINFO 模式的 URL,param 也可以接收。

1 //param獲取URL所有參數
2 print_r(I('param.0'));

PS:取消和開啟 URL 的'URL_PARAMS_BIND_TYPE'=>1 配置定義,在訪問這個 URL 的
時候結果有所不同:http://localhost/demo39/User/index/id/5/type/a

1 關閉 URL 傳參順序:Array ( [id] => 5 [type] => a )
2 開啟 URL 傳參順序:Array ( [0] => id [1] => 5 [2] => type [3] => a )
1 //param獲取指定參數值
2  echo I('param.id');
3  echo I('param.type');

 

默認情況下,I()的默認過濾是: htmlspecialchars ,過濾掉 HTML。

1 //過濾HTML,如果去掉了,則傳遞包含HTML的字符串,將不過濾
2 'DEFAULT_FILTER'=>'htmlspecialchars',

當然,如果不過濾,也可以在程序中過濾。

1 //設置過濾函數,會忽略配置文件里的設置
2  echo I('get.id', '', 'htmlspecialchars');

如果系統設置了默認的過濾,本身某個函數又不想過濾,那么可以這么處理:

1 //設置屏蔽系統默認過濾
2  echo I('get.id','',  false); //第三參數為空字符串均可

 

什么才是過濾?

如果在 WeiBo/Common/Conf/config.php 中沒有配置 'DEFAULT_FILTER'=>'htmlspecialchars', 則,當url為

 http://localhost/demo39/user/index?id=<b style="font-size:200px">5</b> ,則輸出為: <b style="font-size:200px">5</b> ,

配置了 'DEFAULT_FILTER'=>'htmlspecialchars', 結果還是 <b style="font-size:200px">5</b>  ,因為I()的默認過濾是: htmlspecialchars ,

這時如果在 WeiBo/Home/Controller/UserController.class.php 中的輸出代碼為echo I('get.id','', false); ,則輸出為字體大小

 

五.請求類型

ThinkPHP 提供了一組常量來判斷當前請求是否是 GET、POST 等。通過判斷請求處理
不同的業務邏輯。

常量 含義
IS_GET 判斷是否 GET 提交請求
IS_POST  判斷是否 POST 提交請求
IS_PUT  判斷是否 PUT 提交請求
IS_DELTE  判斷是否 DELETE 提交請求
IS_AJAX  判斷是否 AJAX 提交請求

 

1 //判斷是否GET請求
2  if (IS_GET) {
3  echo '是GET請求';
4 } else {
5  echo '不是GET請求';
6 }

 默認的 IS_GET 是1, IS_POST 是空, IS_AJAX  需要加入jquery文件才能判定是否是 IS_AJAX  


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()