翻页链接出错八成因未对动态查询参数值单独urlencode(),应只编码值(如$keyword = urlencode($keyword)),键名和路径保持原样,避免双重编码与符号冲突。

PHP翻页函数里 urlencode() 用在哪儿才对
翻页链接出错,八成是把原始参数直接拼进URL了。比如搜索词含空格、中文、& 符号,不编码就会被浏览器截断或解析错。必须对「动态生成的查询参数值」单独编码,而不是对整个 URL 或键名编码。
常见错误写法:urlencode("page=2&keyword=php+教程") —— 这会把 = 和 & 也编码掉,后端根本收不到有效参数。
- 只对参数值编码:比如
$keyword = urlencode($keyword) - 键名(如
page、keyword)保持原样,不编码 - 已有 URL 中的固定路径部分(如
/search.php)也不参与urlencode() - 如果参数值本身已部分编码(比如来自
$_GET),先urldecode()再重新urlencode(),避免双重编码
翻页链接拼接时怎么避免 & 符号冲突
手动拼 URL 时,多个参数之间用 & 连接,但若某个参数值里本身就含 &(比如用户搜 “C++ & Python”),不编码就会被当成参数分隔符,导致后续参数丢失。
正确做法是每个值独立编码后再拼接:
$base = '/list.php'; $page = 3; $keyword = 'C++ & Python'; $encoded_keyword = urlencode($keyword); // → C%2B%2B+%26+Python $url = $base . '?page=' . $page . '&keyword=' . $encoded_keyword;
注意:不要用 http_build_query() 直接包整个数组就完事——它默认用 PHP_QUERY_RFC1738 编码规则,对某些特殊字符(如 +)处理和浏览器不一致;PHP 7.2+ 建议显式指定 PHP_QUERY_RFC3986:
http_build_query(['page' => 3, 'keyword' => 'C++ & Python'], '', '&', PHP_QUERY_RFC3986)- 这样生成的
+会变成%2B,空格变成%20,更可靠
中文、emoji、生僻字在翻页中乱码怎么办
本质是字符集不统一:PHP 文件保存为 UTF-8,但没声明输出编码,或数据库/表单提交用了 GBK,导致 urlencode() 编码的是错误字节流。
检查三处:
- PHP 脚本开头加
header('Content-Type: text/html; charset=utf-8'); - HTML 页面
<meta charset="utf-8">必须存在且位置靠前 - 接收参数时,确认
$_GET['keyword']是原始 UTF-8 字节(不是被自动转码过的);若用 Nginx + PHP-FPM,留意fastcgi_param是否覆盖了QUERY_STRING
emoji 通常占 4 字节,在旧版 MySQL 或某些中间件里会被截断。翻页时若把 emoji 当参数传,建议前端先用 JavaScript 的 encodeURIComponent() 编码,PHP 端用 urldecode() 接收,比纯 PHP 处理更稳。
用 rawurlencode() 还是 urlencode()
区别在于空格:前者编码成 %20,后者编码成 +。浏览器都能识别,但某些 API 或严格校验的后端(比如某些 OAuth 接口)要求空格必须是 %20。
翻页场景下推荐用 rawurlencode():
- 语义更清晰:所有非字母数字字符一律百分号编码,无例外
- 与 JavaScript 的
encodeURIComponent()行为一致,前后端联调少踩坑 -
urlencode()的+在某些代理或 CDN 上可能被误还原为空格
别忘了:rawurlencode() 不处理 /、:、@ 等 URL 保留字符,所以依然只能用于参数值,不能用于路径段。
最常被忽略的一点:翻页函数里做编码,得确保每次生成链接都走同一套逻辑——如果有的地方用 urlencode(),有的用 rawurlencode(),或者有的漏了编码,用户点一次链接就丢一次参数。统一封装一个 build_pagination_url() 函数,把编码逻辑锁死在里面,比到处写 urlencode() 安全得多。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











