thinkphp分页需显式传query参数透传搜索条件,否则页码链接丢失get参数;where必须初始化为空数组避免非法偏移;post表单须改method=get;tp3.2需手动拼接urlencode后的parameter字符串。

ThinkPHP 分页必须带查询条件才能正常跳转,否则第二页就丢失搜索关键词——这不是 bug,是设计逻辑决定的:分页链接默认只含 page 参数,where 条件不自动透传。
TP5/6 中 paginate() 必须显式传 query 参数
TP5 和 TP6 的 paginate() 默认不会读取当前 URL 的 GET 查询参数。如果你用 input('get.keyword') 拿到搜索词,但没告诉分页器,它生成的页码链接里就不会带 ?keyword=xxx。
-
paginate(10)只管总数和当前页,不关心 URL 上还有什么 - 必须用
query参数手动注入,例如:->paginate(10, false, ['query' => $params]) -
$params应该是原始 GET 数组(如$_GET),不是加工后的where数组 - 中文或特殊字符要提前
urlencode,但 TP6 会自动处理,TP5 建议用array_map('urlencode', $_GET)
where 数组初始化不能写成 $where = 1
常见报错 Illegal string offset 'name' 就是因为把 $where 初始化成了字符串或数字,而不是数组。
- 错误写法:
$where = 1或$where = ''—— 后续$where['name'] = [...]会崩 - 正确写法:
$where = [](空数组),再按需追加键值对 - 如果条件全靠
input()动态生成,建议统一用array_filter()清理空值,避免like '%%'这种无效条件
POST 表单分页必须改 method=get
分页链接本质是 GET 请求,POST 提交后点“下一页”,浏览器只会发 GET,原始 POST 数据彻底丢失。
- 表单必须写
<form method="get"></form>,不能用post - 隐藏域(如
<input type="hidden" name="is_search" value="1">)可用来区分普通访问和带条件访问 - 后台用
input('get.') === []判断是否为首次加载,避免空条件查全表 - TP6 中可配合
request()->param()统一取参,但分页仍需显式传query
TP3.2 的 Page 类要手拼 parameter 字符串
TP3.2 没有 query 参数支持,得手动拼接 $Page->parameter,且必须 URL 编码。
- 不能直接
$Page->parameter = $_GET,会报错类型不匹配 - 推荐写法:
foreach ($_GET as $k => $v) { $Page->parameter .= "$k=".urlencode($v).'&'; } - 注意结尾多一个
&没关系,Page::show()内部会 trim - 若用
I('get.xxx'),确保它返回的是原始值,而非被自动过滤过的内容(比如去除了空格)
最易忽略的一点:分页器生成的链接路径(path)默认是当前 URL 路径,但如果页面用了伪静态或子目录部署,path 需手动指定,否则页码链接可能指向根目录或 404。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











