三. 跳轉和重定向
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
文章列表