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.、总之一个原则,就是统一编码和解码的规范