TP3.2.3使用page分页类对查询结果进行分页时的问题

TP3.2.3使用page分页类对查询结果进行分页时的问题



最近在完成公司的任务的时候遇到了一个小问题,因为以前没遇到过,所以浪费了很多时间,下面把遇到的问题和解决方法和大家分享一下,避免大家踩坑。
HTML部分代码

...
<input type="text" name="searchInfo" value="{$searchInfo}">
...

php部分代码

$searchInfo = trim(I('get.searchInfo'));
...
...
$numCount = $db->alias( 'S' )->join($join)
            ->field( $field )
            ->where($where)
            ->order( $order )
            ->count();
$offset = 30;
$page = new \Think\Page($numCount,$offset);
$show = $page->show();
$list = $db->alias( 'S' )->join( $join )
            ->field( $field )
            ->where($where)
            ->order( $order )
            ->page($_GET['p'].",$offset")
            ->select();

$this->assign([
            'page' => $show,
            'list' => $list,
            'searchBy' => [$tem => 'selected'],
            'searchInfo' => $searchInfo
        ]);

因为查询中涉及到特殊字符空格,所以出现了以下bug:

  • 第一页查询正常,但是生成的分页按钮的href链接出现了问题:空格被转化成了‘+’号,当用谷歌浏览器的时候,它会对采用urlencode编码的链接进行自动解码(你不做,浏览器会做。。),导致href链接中searchInfo的参数多了个‘+’号,所以点第二页的时候,你的查询条件就变成了多个‘+’号的searchInfo,导致什么结果都没有(好郁闷)。。

为什么会产生这个问题?

  • TP3.2.3中的page类,U()方法会对生成的url进行urlencode编码,而这边采用的是HTML4编码方式进行的编码,所以空格被转化成‘+’号了。在浏览器(客户端)解码的时候,它默认采取的是RFC-3986编码方式进行解码,RFC-3986编码的结果是将空格编码成‘%20’,所以由于客户端和服务端采用不同的编码方式,‘+’号最后不能被解码,而是会原封不动的保留下来

怎么解决?

1.、统一编码,服务端也采用RFC-3986编码方式进行解码,将page类中的url()方法和U()方法中进行urlencode()编码的地方全部改为rawurlencode()编码

U()方法中:

if(!empty($vars)) { // 添加参数
      foreach ($vars as $var => $val){
           if('' !== trim($val))   $url .= $depr . $var . $depr . rawurlencode($val);
      }                
}

page类url()方法中:

private function url($page){
       return str_replace(rawurlencode('[PAGE]'), $page, $this->url);
}

2.、在通过get方式获取searchInfo的值得时候,使用urldecode()强制解码一次,使他按照HTML4编码方式进行解码

$searchInfo = urldecode(trim(I('get.searchInfo')));

3.、总之一个原则,就是统一编码和解码的规范

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值