【问题标题】:A problem of a repeated parameter in the pagination links?分页链接中重复参数的问题?
【发布时间】:2010-06-05 16:56:58
【问题描述】:

问题是,例如,当我加载第 2 页时,URL 变为:

http://domain.com/index.php?restaurant-id=45&currentpage=2

这很好,但是当我进入第 3 页时,它变成了:

http://domain.com/index.php?restaurant-id=45&currentpage=2&currentpage=3

以此类推,每次从分页链接加载新页面时,它都会添加一个 currentpage 参数!

我想知道如何解决这个问题?

这是一些分页功能的代码

 /******  build the pagination links ******/
// Getting current page URL with its parameters
$current_page_url = ($_SERVER["PHP_SELF"].(isset($_SERVER["QUERY_STRING"])?"?".htmlentities($_SERVER["QUERY_STRING"]):""));
// Determine which sign to use (? or &) before the (currentpage=xx) parameter
$sign = preg_match('/\?/', $current_page_url) ? '&' : '?';

$pagination_links = '';
// if not on page 1, don't show back links
if ($currentpage > 1) {
   // show << link to go back to page 1
   $pagination_links .= " <a href='{$current_page_url}{$sign}currentpage=1'>First page</a> ";
   // get previous page num
   $prevpage = $currentpage - 1;
   // show < link to go back 1 page
   $pagination_links .= " <a href='{$current_page_url}{$sign}currentpage=$prevpage'>previous</a> ";
}
else
{
    $pagination_links .= "ـ ـ"; 
}// end if 

【问题讨论】:

  • 非常感谢你们的精彩回答,这对我帮助很大。 :)
  • 您接受的问题和回答对我帮助很大。

标签: php parameters pagination


【解决方案1】:

您可以为此使用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】:

    您可以使用正则表达式从 $current_page_url 变量中删除 currentpage 参数,尽管它很难看。

    $current_page_url = preg_replace('currentpage=\d+', '', $current_page_url);
    

    但是,我建议编写一个小函数,该函数将根据您传递给它的值生成 URL,然后您可以轻松修改任何参数,而不必担心正则表达式并将它们从 URL 中删除。 this 之类的东西应该没问题。

    【讨论】:

      【解决方案3】:

      我会做得更好

      $params = $_GET;
      if(isset($params['currentpage'])) unset($params['currentpage']);
      $pagination_links = '';
      for($i = 1; $i <= 5; $i++){ // lets make 5 links for example
          $pagination_links.= '<a href="'.$_SERVER['PHP_SELF'].'?'.http_build_query($params+array('currentpage' => $i)).'">'.$i.'</a>';
      }
      

      【讨论】:

        【解决方案4】:

        您需要从查询字符串中删除之前的值,例如:

        preg_replace('/&currentpage=\\d+/', '', $_SERVER["QUERY_STRING"]);
        

        而不仅仅是$_SERVER["QUERY_STRING"]

        我更喜欢使用这样的类来操作查询字符串:

        final class QueryString
        {
            private $data;
        
            private function __construct($start=null) {
                if ($start === null)
                    $this->data = $_GET;
                elseif (!is_array($start))
                    throw new InvalidArgumentException();
            }
        
            public function __isset($nm) {
                return isset($this->data[$nm]);
            }
        
            public function __unset($nm) {
                unset($this->data[$nm]);
            }
        
            public function __get($nm) {
                return isset($this->data[$nm])?$this->data[$nm]:"";
            }
        
            public function __set($nm, $val) {
                $this->data[$nm] = $val;
            }
        
            public function getString() {
                return $this->getStringInternal(false);
            }
        
            public function getStringHTML() {
                return $this->getStringInternal(true);
            }  
        
            public function __toString() {
                return $this->getString();
            }
        
            private function getStringInternal($HTML=false) {
                if (empty($this->data))
                    return "";
        
                $res = "?";        
                foreach ($this->data as $k => $v) {
                    if (!is_array($v)) {
                        if ($v === "")
                            $res .= urlencode($k).'&';
                        else
                            $res .= urlencode($k)."=".urlencode($v).'&';
                    }
                    else
                        foreach ($v as $vv) {
                            $res .= urlencode($k)."[]=".urlencode($vv).'&';
                        }
                }
        
                $res = substr($res,0,-1);
                if ($HTML)
                    $res = htmlspecialchars($res);
        
                return $res;
            }
        }
        

        那我就可以了:

        $qs = new QueryString();
        $qs->currentpage = 7;
        $url = "list.php" . $qs;
        

        它会保留之前的所有参数,如果不存在则创建“currentpage”,如果存在则修改它。

        注意:如果您愿意,可以将 getStringInternal 的循环替换为 http_build_query。当一个键有多个值时,我不喜欢http_build_query 的行为;我更喜欢 "a=1&a=2" 到 "a[0]=1&a[1]=2" 并且原版没有在键中添加 "[]";但是 PHP 不能很好地支持键中没有括号的多个值(我必须手动解析查询字符串),我有时会与之交互的 Java Web 服务)。

        【讨论】:

          【解决方案5】:

          好的,在您的示例中,如果我没记错的话,您的基本链接是:http://domain.com/index.php?restaurant-id=45

          您所有的分页链接应如下所示,以保持网址处于良好状态。

          http://domain.com/index.php?restaurant-id=45<?php if($_GET['currentpage'] != NULL) { echo '&currentpage='.$_GET['currentpage']; } ?>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-04-16
            • 1970-01-01
            • 2011-11-04
            • 2016-01-18
            • 1970-01-01
            • 2021-06-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多