2012-03-12 71 views
4

分页时有什么方法可以保留我的GET参数。在分页过程中保留url参数

我的问题是,我有几个不同的URL,即

questions.php?sort=votes&author_id=1&page=3 

index.php?sort=answers&style=question&page=4 

如何在我的分页类我应该创造上有一个不同的页码链接的网页,但仍然保留其他部分网址?

回答

5

总之,你只是解析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 modulehttp_build_urlhttp_build_str。后者可以替换为http_build_query,如果您没有安装模块,则第一个PHP用户空间实现存在。

另一种方法是使用Net_URL2包,它提供了一个接口,以不同的URL操作:

$op = new Net_URL2($url); 
$op->setQueryVariable('page', $page); 
$newUrl = (string) $op; 

这是更加灵活和表现力。

+0

这是否被认为是最佳做法,或者您通常不会因为需要这种情况而结束? – yehuda 2012-03-12 12:35:43

+0

如果将其封装到一个函数或类中,我会认为它是最佳实践,因此您可以在代码中轻松访问它。此外,它重新使用现有的功能,这是最好的。无论URL的query-info-part中有多少个参数,它都可以工作,并且尊重您的PHP配置。 – hakre 2012-03-12 12:40:28

+0

@yehuda:我添加了一些额外的例子,它使用一个制作精良的组件来完成这项工作,这可能是更好的做法。 – hakre 2012-03-12 12:45:12

0

如何在会话中存储您的page参数,因此您不必修改每一个页面url?

+0

但是,如何更改网址的页面参数? – yehuda 2012-03-12 12:25:29

+0

你不需要。存储和检索值严格在服务器端发生,并且与实际的页面链接无关。 – Sirko 2012-03-12 12:27:51

+2

如果您关心搜索引擎优化和书签功能,这将是不好的做法 – 2012-03-12 12:36:56

6

您可以使用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); 
2

如果你想写自己的函数,不喜欢的东西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> 
+1

['http_build_query'](http://php.net/http_build_query)总是可用的,为什么重新发明轮子? – hakre 2012-03-12 12:47:00

+0

根据你想对数据做什么,该函数可能是有用的,我明白,作为函数坐在它会更好地使用http_build_query - 给OP选项。 – 2012-03-12 12:53:41

+0

是的,你应该让URL成为一个输入参数,而不是在里面埋藏的地方使用'$ _GET'。或者至少让'$ gets'成为函数的一个参数。 – hakre 2012-03-12 12:57:35