【问题标题】:basic pagination equation issues基本分页方程问题
【发布时间】:2017-11-01 02:37:34
【问题描述】:

我正在查看一些遗留代码,并希望在一些事情上得到一些帮助。

我所有的问题都与分页有关。

首先,在以下查询中,我们正在计算总页数。 $itemsperpage=40 here

$rs0=mysqli_fetch_array(mysqli_query($dbh,"select floor(count(1)/$itemsperpage)+1 as pages from scx_media where scx_media.mediaid in (select mediaid from animated_gifs where status>0)"));

为什么我们先把它取底,然后加 1?

其次,

在这段代码中,我们创建了起始变量(用于 sql 查询)。

$page=(int)$_GET['page'];
$pages=$rs0[pages];
if($page>$pages)$page=$pages;
$start=($page-1)*$itemsperpage;

为什么我们从页面中减去一个?因为我们从 0 开始所以我们必须减 1?

最后,

假设我们有40 itemsperpage item count is 40 as well。使用此配置,we'd have a second page with no data 因为它会在满足每页要求的第一页上显示 40 个项目,然后根据页数计算我们会有第二页但不会有记录。 我该如何解决这个问题?

【问题讨论】:

  • “我们为什么要从页面中减去 1?” 您的猜测似乎是合理的,但我们都不知道您的旧代码是如何工作的。
  • 通常从我在其他遗留代码中看到的......是“为什么我们从页面中减去一个?”是由于sql中的LIMIT第一次匹配需要以0开头,以此类推。 - 编辑 - ...实际上这听起来很不对。我们需要更多你的 sql 和代码才能确定,哈哈。
  • “我该如何解决这个问题?”如果你使用 MySQL,你可以看看SQL_CALC_FOUND_ROWS
  • 对 SQL_CALC_FOUND_ROWS 感兴趣:stackoverflow.com/questions/186588/…

标签: php pagination


【解决方案1】:

假设您有 40 个结果,每页显示 40 个项目。 你会想要 1 页有 40 个结果。

让我们“玩”一下代码。您的用户询问 page.phtml?page=1:

$page=(int)$_GET['page'];           # $page = 1
$pages=$rs0[pages];                 # $pages = 1
if($page>$pages)$page=$pages;       # 1 > 1, no so no change
$start=($page-1)*$itemsperpage;     # $start = (1 - 1) * 10 = 0

所以第 1 页上显示的第一个项目将是 0。 第 1 页:从结果 0 开始。显示 40。 而且您不应该向用户提供“下一页”!

您的用户询问 page.phtml?page=2

$page=(int)$_GET['page'];           # $page = 2
$pages=$rs0[pages];                 # $pages = 1
if($page>$pages)$page=$pages;       # 2 > 1, yes so $page = 1
$start=($page-1)*$itemsperpage;     # $start = (1 - 1) * 40 = 0

因此,如果 $page 大于 $pages,您将强制用户返回 ?page=1 并再次从结果号 0 开始。

其实看起来不错……

对于 SQL:

select floor(count(1)/$itemsperpage)+1 as pages ...

应该是:

select ceil(count(1)/$itemsperpage) as pages ...

【讨论】:

  • 但我的问题是请求第 1 页时 $pages 等于 2,因为 floor(40/40)+1 等于 2,所以我们有一个空白页
  • 修正了我的答案
【解决方案2】:

我正在使用 2 个 URL 变量 $_GET['page']$_GET['pageSize'] 进行分页

例如/users?page=5&pageSize=30

$query ="
SELECT SQL_CALC_FOUND_ROWS *
FROM
    user
LIMIT ?
OFFSET ?
";
$variables = [$_GET['pageSize'],$_GET['page']];
 // don't forget to sanitize the pageSize , for example allow only (15,30,50)
 //then get the total found rows right after 
 $query = "SELECT FOUND_ROWS()";

这使得分页比让 MySql 计算页面大小和做更多应该在应用层完成的事情更容易。但是,为了快速解决当项目数等于每页项目数时获得额外空白页面的问题,您可以在 SQL 语句中添加一个额外条件,仅当除法有余数时才加 1

改变这个

select floor(count(1)/$itemsperpage)+1

到这里

select (CASE WHEN floor(count(1)%$itemsperpage) THEN floor(count(1)/$itemsperpage)+1 ELSE floor(count(1)/$itemsperpage) END)

Modulo "%" operation

但正如我所说,我不会使用数据库服务器来完成计算所需页数的工作。这是一个应用层的工作。我什至在客户端这样做。


编辑: 您可以像这样在应用层(PHP)计算$pagesNumber
$result = $mysqli->query("SELECT FOUND_ROWS() found_rows");
$foundRows = $result->fetch_array(MYSQLI_ASSOC)['found_rows'];
$pagesNumber = ceil($foundRows / $itemsperpage); //thanks to Nic3500 answer

【讨论】:

  • 你能详细解释一下你是如何在应用层而不是数据库中做到这一点的吗
猜你喜欢
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 2011-06-27
  • 2011-01-27
  • 2016-12-12
相关资源
最近更新 更多