分页时有什么方法可以保留我的GET参数。在分页过程中保留url参数
我的问题是,我有几个不同的URL,即
questions.php?sort=votes&author_id=1&page=3
index.php?sort=answers&style=question&page=4
如何在我的分页类我应该创造上有一个不同的页码链接的网页,但仍然保留其他部分网址?
分页时有什么方法可以保留我的GET参数。在分页过程中保留url参数
我的问题是,我有几个不同的URL,即
questions.php?sort=votes&author_id=1&page=3
index.php?sort=answers&style=question&page=4
如何在我的分页类我应该创造上有一个不同的页码链接的网页,但仍然保留其他部分网址?
总之,你只是解析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()为此。它比手动删除旧参数要干净得多。
应该可以传递由$ _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);
如果你想写自己的函数,不喜欢的东西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>
这是否被认为是最佳做法,或者您通常不会因为需要这种情况而结束? – yehuda 2012-03-12 12:35:43
如果将其封装到一个函数或类中,我会认为它是最佳实践,因此您可以在代码中轻松访问它。此外,它重新使用现有的功能,这是最好的。无论URL的query-info-part中有多少个参数,它都可以工作,并且尊重您的PHP配置。 – hakre 2012-03-12 12:40:28
@yehuda:我添加了一些额外的例子,它使用一个制作精良的组件来完成这项工作,这可能是更好的做法。 – hakre 2012-03-12 12:45:12