控制器[2]
三. 跳转和重定向
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