【发布时间】:2012-03-28 20:14:04
【问题描述】:
有什么方法可以在分页时保留我的 GET 参数。
我的问题是我有几个不同的网址,即
questions.php?sort=votes&author_id=1&page=3
index.php?sort=answers&style=question&page=4
我应该如何在我的分页类中创建一个指向具有不同页码的页面的链接,但仍保留 URL 的其他部分?
【问题讨论】:
标签: php pagination
有什么方法可以在分页时保留我的 GET 参数。
我的问题是我有几个不同的网址,即
questions.php?sort=votes&author_id=1&page=3
index.php?sort=answers&style=question&page=4
我应该如何在我的分页类中创建一个指向具有不同页码的页面的链接,但仍保留 URL 的其他部分?
【问题讨论】:
标签: php pagination
如何将page 参数存储在会话中,这样您就不必修改每个页面的网址?
【讨论】:
您可以为此使用 http_build_query()。这比手动删除旧参数要干净得多。
应该可以传递一个由 $_GET 和您的新值组成的合并数组,并获得一个干净的 URL。
$new_data = array("currentpage" => "mypage.html");
$full_data = array_merge($_GET, $new_data); // New data will overwrite old entry
$url = http_build_query($full_data);
【讨论】:
简而言之,您只需解析 URL,然后在末尾添加参数或替换它(如果已存在)。
$parts = parse_url($url) + array('query' => array());
parse_str($parts['query'], $query);
$query['page'] = $page;
$parts['query'] = http_build_str($query);
$newUrl = http_build_url($parts);
此示例代码需要PHP HTTP module 用于http_build_url 和http_build_str。后者可以替换为http_build_query,对于第一个,存在 PHP 用户空间实现,以防您没有安装模块。
另一种选择是使用Net_URL2 包,它为各种 URL 操作提供接口:
$op = new Net_URL2($url);
$op->setQueryVariable('page', $page);
$newUrl = (string) $op;
它更加灵活和富有表现力。
【讨论】:
如果您想编写自己的函数来执行类似 http_build_query 的操作,或者如果您出于某种原因需要自定义它的操作:
<?php
function add_edit_gets($parameter, $value) {
$params = array();
$output = "?";
$firstRun = true;
foreach($_GET as $key=>$val) {
if($key != $parameter) {
if(!$firstRun) {
$output .= "&";
} else {
$firstRun = false;
}
$output .= $key."=".urlencode($val);
}
}
if(!$firstRun)
$output .= "&";
$output .= $parameter."=".urlencode($value);
return htmlentities($output);
}
?>
然后你可以写出你的链接,比如:
<a href="<?php echo add_edit_gets("page", "2"); ?>">Click to go to page 2</a>
【讨论】:
http_build_query 始终可用,为什么要重新发明轮子?
$_GET。或者至少让$gets成为函数的参数。