我在我的网站中使用以下脚本来创建分页“下一个-上一个”功能。它实际上是 Dreamweaver 的代码。该脚本使用 url 获取一些值,然后重新创建它。 IE7 和 IE8 中的结果 url 包含不可读字符,最终页面无法正常工作。
$queryString_met = "";
if (!empty($_SERVER['QUERY_STRING'])) {
$params = explode("&", $_SERVER['QUERY_STRING']);
$newParams = array();
foreach ($params as $param) {
if (
stristr($param, "pageNum_met") == false
&& stristr($param, "totalRows_met") == false
) {
array_push($newParams, $param);
}
}
if (count($newParams) != 0) {
$queryString_met = "&" . htmlentities(implode("&", $newParams));
}
}
$queryString_met = sprintf("&totalRows_met=%d%s", $totalRows_met, $queryString_met);
然后当我显示数据时,我使用:
<a href="<?php printf("%s?pageNum_met=%d%s", $currentPage, max(0, $pageNum_met - 1), $queryString_met); ?>"> << </a>
我不明白代码的哪一部分负责这个问题。
htmlentities(implode("&", $newParams));
htmlentities
对字符串中的所有非 ASCII 字节进行编码,通常是不必要的,并且,如果您不指定 charset
参数,则猜测您的字符串采用 ISO-8859-1,这对于希腊语来说肯定不会是。 (希望您网站中的所有内容都使用 UTF-8。)
使用
htmlspecialchars
代替,这将保留非 ASCII 字符,只对真正需要编码的内容进行编码。
但是,要使这成为一个问题,您必须直接在 URL 中使用非 ASCII 字符。这确实不靠谱;不。未编码的非 ASCII 字符在 URI 中根本无效;它们必须是
%
编码的(例如使用 urlencode
)。 IRI 允许非 ASCII 字符,浏览器可以自动对其进行 UTF-8 编码和 % 编码以将其转换为 URI,但 IE 并不(总是)这样做。
[处理查询字符串的脚本对于任何包含目标名称的值都将失败,而不仅仅是以它们开头的值。]
我认为您需要在 Dreamweaver 中为该页面选择文档编码:
转到
Modify->Page Properties
菜单,然后在对话框中选择 Title/Encoding
,然后选择 Western European 编码。
编辑:
我认为最佳实践是使用查询字符串解析器填充数组,删除具有黑名单键的元素,然后使用
http_build_query()
重建新的查询字符串以确保浏览器兼容性,然后使用 htmlspecialchars()
确保 HTML 实体编码。
通过使用联合运算符(
+
)将用户传入的参数附加到新建的查询字符串中,pageNum_met
和totalRows_met
值不能被覆盖或重复。
// Assumed variables: $currentPage, $pageNum_met, and $totalRows_met
if (!empty($_SERVER['QUERY_STRING'])) {
parse_str($_SERVER['QUERY_STRING'], $params);
}
unset($params['pageNum_met'], $params['totalRows_met']);
$params = ['totalRows_met' => $totalRows_met] + $params;
$prevPageUrl = sprintf(
"%s?%s",
$currentPage,
http_build_query(['pageNum_met' => max(0, $pageNum_met - 1)] + $params
);
$nextPageUrl = sprintf(
"%s?%s",
$currentPage,
http_build_query(['pageNum_met' => max(0, $pageNum_met + 1)] + $params
);
printf('<a href="%s"> << </a>', htmlspecialchars($prevPageUrl, ENT_QUOTES, 'UTF-8'));
printf('<a href="%s"> >> </a>', htmlspecialchars($nextPageUrl, ENT_QUOTES, 'UTF-8'));