• 控制器[2]


    三. 跳转和重定向

    ThinkPHP 在操作数据库时,需要跳转和重定向页面。ThinkPHP 提供了一组方法来解
    决了这个问题。

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

    
    
     1 <?php
     2 
     3 namespace HomeController;
     4 use ThinkController;
     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 HomeController;
     4 use ThinkController;
     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 HomeController;
     4 use ThinkController;
     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  

  • 相关阅读:
    monkey命令
    app性能测试点
    app常见性能测试点
    httprunner中validate的比较方法总结
    ETL工具kettle基本使用
    dbvis MySQL server version for the right syntax to use near 'OPTION SQL_SELECT_LIMIT=DEFAULT' at line 1
    python操作Redis
    mongodb,redis,hbase 三者都是nosql数据库,他们的最大区别和不同定位是什么?
    Redis Desktop manger的下载安装
    Redis的参考文档
  • 原文地址:https://www.cnblogs.com/jacson/p/4582126.html
Copyright © 2020-2023  润新知