分页参数应存 cookie 而非 session,用 setcookie() 设置带前缀的 myapp_perpage/myapp_sort,值需过滤(数字清洗、白名单校验),读取时 isset+类型判断 fallback 默认值,分页链接须合并 url 参数与 cookie 值,用户修改偏好需 prg 模式重定向更新。

分页参数存 Cookie 用 setcookie() 而不是 $_SESSION
用户切换每页条数(如 10/20/50)或排序字段后,希望下次进来还保持这个设置——这属于「客户端偏好」,不该依赖服务端 session 生命周期。直接写 Cookie 更轻量、更可控。
关键点:setcookie() 必须在任何输出前调用;Cookie 值要过滤和转义;有效期建议设为 30 天左右,避免永久残留。
- 用
filter_var($value, FILTER_SANITIZE_NUMBER_INT)清洗每页数量,防止注入非数字值 - 排序字段(如
sort)只允许白名单:['id', 'created_at', 'title'],其他一律忽略 - Cookie 名建议带项目前缀,比如
myapp_perpage和myapp_sort,避免和其他系统冲突
读取 Cookie 时 fallback 到默认值,别让 $_COOKIE 缺失导致 Notice
第一次访问或 Cookie 过期后,$_COOKIE['myapp_perpage'] 不存在,直接取会触发 PHP Notice。必须显式判断并给默认值。
示例逻辑:
立即学习“PHP免费学习笔记(深入)”;
$perpage = isset($_COOKIE['myapp_perpage']) && is_numeric($_COOKIE['myapp_perpage'])
? (int)$_COOKIE['myapp_perpage']
: 15;
<p>$sort = in_array($_COOKIE['myapp_sort'] ?? '', ['id', 'created_at', 'title'])
? $_COOKIE['myapp_sort']
: 'id';
注意:不能用 $_COOKIE['xxx'] ?? 'default' 直接赋值再校验,因为空字符串、'0'、'null' 都可能被错误接受。
分页链接生成时,要把 Cookie 偏好自动带进 URL 参数
前端分页控件(如上一页 / 下一页 / 页码跳转)的 href 必须包含当前生效的 perpage 和 sort,否则点击后偏好丢失。不能只靠 Cookie 自动生效——HTTP 是无状态的,GET 请求不携带 Cookie 上下文到新页面。
- 构造分页链接时,用
http_build_query(array_merge($_GET, ['perpage' => $perpage, 'sort' => $sort]))合并参数 - 如果 URL 已有
perpage,优先用 URL 参数(方便用户临时覆盖),再 fallback 到 Cookie 值 - 避免把 Cookie 值硬编码进链接,否则用户手动改 URL 参数后,下次刷新又回退到 Cookie 值,体验割裂
用户主动修改偏好时,同步更新 Cookie 并重定向,防止重复提交
常见场景:表单提交每页数量,或点击「按标题排序」按钮。若只是 POST 后直接渲染,F5 刷新会重复提交;应采用 Post-Redirect-Get(PRG)模式。
操作步骤:
- 接收 POST 数据,验证并清洗(如
$_POST['perpage']必须是整数且在 5–100 之间) - 调用
setcookie('myapp_perpage', $perpage, time() + 30 * 86400, '/'),注意路径设为'/'保证全站可读 - 用
header('Location: ' . $_SERVER['REQUEST_URI']); exit;重定向回当前页(含已有查询参数)
漏掉重定向,就容易出现「点两次排序按钮,Cookie 被写两次但页面没刷新」的问题;而没加 exit,重定向后后续代码仍执行,可能引发意料外行为。
真正麻烦的是多维度组合:比如同时记「每页数」「排序字段」「排序方向(ASC/DESC)」「搜索关键词」。这时别堆一个大 Cookie,拆成多个独立键,或者用 JSON 存但必须 json_encode() + urlencode() 双重处理,否则特殊字符会截断。











