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

来源:互联网 发布:纵横九州神羽进阶数据 编辑:程序博客网 时间:2024/05/16 17:44

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
原创粉丝点击