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

时间:2022-10-27 14:39:41

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