分页后搜索条件丢失是因为paginate()默认不透传get参数,必须显式配置query选项,如paginate(15, false, ['query' => request()->get()]),tp3则需修改page类parameter并递归urlencode处理。

分页后搜索条件丢失,本质是 GET 分页链接没携带原始查询参数。ThinkPHP 本身不自动透传 $_GET,必须显式注入,否则点“第2页”就回到全量数据。
ThinkPHP 5/6 中用 paginate() 透传 query 参数
这是最简、最稳的方案,适用于绝大多数带搜索的列表页。关键在第三个参数——query 配置项必须手动传入当前所有有效查询参数。
-
paginate()默认只生成页码参数(如?page=2),不保留?keyword=abc&status=1 - 必须显式写成
paginate(15, false, ['query' => $this->request->param()]),其中$this->request->param()是全部 GET + POST 合并后的数组(TP5/6 默认行为) - 若只想透传 GET 参数(更安全),改用
['query' => $this->request->get()] - 注意:不能用
I('get.')(TP3 写法),TP5/6 应统一走$this->request->get()或$this->request->param()
ThinkPHP 3.2 手动拼接 Page 类的 parameter
TP3 没有 paginate() 的 query 机制,得靠修改 Page 实例的 parameter 属性。这里最容易漏掉的是中文或数组型参数。
- 直接赋值
$Page->parameter = $_GET;会出错:中文未 urlencode,多维数组(如status[0]=1&status[1]=2)会被丢弃 - 必须先做 urlencode 处理,推荐封装函数:
array_urlencode($_GET),该函数需递归处理键和值,并对数组元素逐层 encode - TP3.2.3 的
Page类第47行附近,把默认的空数组初始化逻辑替换成$this->parameter = empty($parameter) ? array_urlencode($_GET) : $parameter; - 如果表单用了 POST,务必改成 GET,否则分页跳转时 POST 数据彻底消失——这是新手最常卡住的地方
前端 JS 动态补参(仅作兜底,慎用)
当后端无法修改(如接手遗留项目),可用 JS 在 DOM 渲染后修补分页链接。但这是权宜之计,存在明显缺陷。
- jQuery 示例:
$('.num,.prev,.next').attr('href', function(i, h) { return h + '?search=' + encodeURIComponent({$search}); }); - 问题一:URL 可能已有问号,硬拼会导致
?page=2?search=xxx语法错误,需先检测是否存在? - 问题二:分页 HTML 是服务端渲染的,JS 补参前页面已发出请求,可能造成首次点击仍丢失条件
- 问题三:SEO 不友好,爬虫看不到完整参数链;移动端 WebView 里部分 UA 对动态 href 支持不稳定
真正可靠的持久化,永远取决于后端是否把 $_GET 完整、安全地注入分页生成逻辑。JS 补参只是临时止血,一旦后端可维护,立刻切回 query 或 parameter 方案。多维数组和中文参数的 urlencode 处理,是 TP3 和 TP5/6 共同容易忽略的细节。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











