【问题标题】:keeping url parameters during pagination在分页期间保留 url 参数
【发布时间】: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


    【解决方案1】:

    如何将page 参数存储在会话中,这样您就不必修改每个页面的网址?

    【讨论】:

    • 但是如何只更改 url 的页面参数?
    • 你不需要。存储和检索值严格发生在服务器端,独立于实际的页面链接。
    • 如果您关心 SEO 和书签功能,这将是一个不好的做法
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      简而言之,您只需解析 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_urlhttp_build_str。后者可以替换为http_build_query,对于第一个,存在 PHP 用户空间实现,以防您没有安装模块。

      另一种选择是使用Net_URL2 包,它为各种 URL 操作提供接口:

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

      它更加灵活和富有表现力。

      【讨论】:

      • 这是否被认为是最佳实践,或者您通常不会遇到需要这样做的情况?
      • 我认为最好的做法是将它包装到一个函数或类中,这样您就可以在代码中轻松访问它。它还重用了现有的功能,这是更可取的。无论 URL 的 query-info-part 中的参数数量如何,它都能正常工作,并尊重您的 PHP 配置。
      • @yehuda:我添加了一些额外的示例,它使用制作精良的组件来完成这项工作,这可能是更好的做法。
      【解决方案4】:

      如果您想编写自己的函数来执行类似 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 始终可用,为什么要重新发明轮子?
      • 根据你想对函数可能有用的数据做些什么,我理解作为函数,最好使用 http_build_query - 提供 OP 选项。
      • 是的,您应该将 URL 设为输入参数,而不是在内部某处使用 $_GET。或者至少让$gets成为函数的参数。
      猜你喜欢
      • 2020-10-23
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      相关资源
      最近更新 更多