4

我使用 GET 进行分页, ?page=1 是第一页,依此类推。

问题是,我想对数据进行排序,使用 GET 是更好的方法,如下所示:

?page=1&sort=date

如果我尝试这样做并单击第 2 页,它将转到 ?page=2 并取消排序。

我也尝试过,但是当从一个页面转到另一个页面时$_SERVER['QUERY_STRING'],我最终会在地址栏中堆积。?page=#

这是我的分页链接的生成方式:

<a href='{$_SERVER['PHP_SELF']}?page=$nextpage'>Next</a>

我该怎么做呢?

4

13 回答 13

8

您可以按照以下方式做一些事情:

// Check if there are any GET parameters
if (!empty($_GET)) {
    $link = "?page=2";

    // Loop through the parameters
    foreach ($_GET as $parameter => $value) {
      // Append the parameter and its value to the new path
      $link .= "&" . $parameter . "=" . urlencode($value);
    }
}
于 2012-06-07T20:29:34.300 回答
3

您可能想查看此线程: 如何使用带有 php 的表单将 GET 变量添加到当前页面 url 的末尾?

基本上使用$_SERVER['REQUEST_URI']来获取当前的 url 和变量,并在链接中附加获取变量。

于 2012-06-07T20:28:24.253 回答
2

$_GET是一个数组,因此您可以遍历其中的元素以重新创建新 URL。PHP 页面上$_GET有许多示例,其中包括一个显示如何遍历数组以从 URL 中删除 GET 参数的示例。

于 2012-06-07T20:30:03.100 回答
2

如果您想将排序参数添加到您的 url(如果它已经设置),您可以执行以下操作:

$qs_sort = isset($_GET['sort']) ? '&sort=' . urlencode($_GET['sort']) : '';

然后更改您<a>要回显的内容以附加$qs_sort到网址的末尾:

<a href='{$_SERVER['PHP_SELF']}?page=$nextpage$qs_sort'>Next</a>
于 2012-06-07T20:30:14.023 回答
1

您需要决定在每个页面上显示多少项目。知道这一点后,您可以轻松地使用页面 GET 变量来确定要从数据库中查询的项目子集,例如,如果每个页面显示 10 个项目,那么第一页是项目 0 到 9,第 2 页是 10 到 19等。当然,这要求您的数据库支持某种选择数据子集的方式。

当然,如果您使用数据库中的一致查询,它将始终以相同的方式排序。

于 2012-06-07T20:28:38.677 回答
1

有几个选项:

  • 将排序参数添加到每个分页链接
  • 将最新的排序列存储在用户的会话中(注意,当用户打开多个选项卡时,这样做的缺点是效果不佳)
  • 如果您使用 ajax 进行分页,请在页码上添加事件处理程序,并让 javascript 存储当前排序字段并在 GET 请求中发送它。
于 2012-06-07T20:29:49.783 回答
1

你可以在这里做的事情很少......

  1. 添加/更改 GET 参数时,请确保另外更改所有指向其他页面的链接。如果您有一个<a href="?page=1">确保&sort=date在选择排序功能时追加。

  2. 单击链接时,您可以使用 jQuery 附加排序参数 -

var _currentSortMethod = 'date';
$("a.someOtherLink").on('click',function(e){
  window.locaton.href = $(this).attr('href') + '&sort=' + _currentSortMethod;
  e.preventDefault();
});
于 2012-06-07T20:30:29.410 回答
1

在您的代码中,如果您正在控制 URL 链接,那么您只需将该排序变量再次传递给您的 URL 链接,如下所示:

<?php     $sorting = $_REQUEST['sort'];
          $page = $_REQUEST['page'];
          $page = $page + 1;
          echo '<a href="datapage.php?page=' . $page . '&sort=' . $sorting. '>Next Page</a>';
?>
于 2012-06-07T20:31:11.767 回答
1

只需将其添加回 URL。

<?php $sort = (isset($_GET['sort'])) ? "&sort=".$_GET['sort'] : ""; ?>

<a href="link.php?page=2<?php echo $sort; ?>">link</a>
于 2012-06-07T20:31:34.087 回答
1

绘制链接进行排序时,检测当前页面并记下包含该页面的链接。此外,在绘制分页器链接时,用检测到的排序写下它们。

假设您在第 2 页并按标题降序对列表进行排序,您的链接应如下所示:

  • 按标题排序
<a href="?page=2&amp;sort=title+desc>Title</a>
  • 按顺序排序
<a href="?page=2&amp;sort=order+desc>Order</a>
  • 分页页面 1
<a href="?page=1&amp;sort=title+desc>1</a>
  • 分页第 3 页
<a href="?page=3&amp;sort=title+desc>3</a>

等等...

于 2012-06-07T20:34:03.710 回答
1

你可以试试这个:

$query = new HttpQueryString();
$query->set("page", $nextPage);
echo "http://www.example.com/?" . $query->toString();

以下是有关 HttpQueryString 类的一些附加文档:http ://www.php.net/manual/en/class.httpquerystring.php

希望有帮助!

于 2012-06-07T21:06:22.910 回答
0

大规模分页通常通过数据库 API 完成。小规模的分页可以通过PHP 会话使用 $_SESSION 变量来完成。

于 2012-06-07T20:29:51.680 回答
-1

对于任何想要保留当前参数的解决方案,如果给定新值则更新并附加新参数的解决方案,这可以完成工作:

代码

$domainurl='https://' . $_SERVER['SERVER_NAME'];
$currenturl=$domainurl . $_SERVER['PHP_SELF'];

function urlVars($new=array()) {
    $url=$GLOBALS['currenturl'];
    $vars=array_merge($_GET, $new);
    foreach ($vars as $key => $var) {
        $params[$x]='&' . $key . '=' . $var;
        $x++;
    } $str='?' . trim(implode($params), '&');
    return $url .= $str;
}

使用示例:

 <a href="' . urlVars(array('page'=>'2', 'view'=>'30', etc.)) . '">Go To Page 2 & Show 30 Results</a>

使用$currenturl仅返回当前页面的域和路径的变量,而不是返回查询字符串的 $_SERVER['REQUEST_URI'] 也解决了重复查询问题并允许更改先前设置的参数。

这是因为array_merge()会将两个或多个数组粘在一起,如果有多个同名的键,最后一个声明的键会占上风,而其他所有键都被否定。并且由于$_GET数组是用旧参数填充的,所以它必须$new数组之前。例子:

$_GET['page']='1';
if ($new['page']='1') {array_merge($_GET, $new);} // 'page'=>'1'
elseif ($new['page']='4') {array_merge($_GET, $new);} // 'page'=>'4'

$_GET['page']='4';
if ($new['page']='2') {array_merge($_GET, $new);} // 'page'=>'2'

笔记

此功能的一个简洁功能以及我辛辛苦苦使用它几个小时直到它完美的全部原因是,您不必在每次有新链接/表单或在另一个中关闭一些数组时都指定相同的参数包含可能的参数键的脚本。您放入$new数组中的所有参数都是新的(显然)或正在更改的参数。它是通用的!

于 2017-04-03T12:57:29.493 回答