基本的分页方程问题

时间:2017-10-31 17:30:22

标签: php pagination

我正在查看一些遗留代码,并希望在一些方面提供一些帮助。

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

首先,在以下查询中,我们计算总页数。 $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?

其次,

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

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

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

最后,

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

2 个答案:

答案 0 :(得分: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并且$ start再次返回结果no.0。

事实上看起来不错......

对于SQL:

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

应该是:

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

答案 1 :(得分:0)

我正在使用2个网址变量[{1}}和$_GET['page']

进行分页

例如$_GET['pageSize']

/users?page=5&pageSize=30

这使得分页更容易比使MySql计算页面大小并执行应该在应用程序层完成的更多内容。但是,为了快速解决当项目数等于每页项目数时获取额外空白页面的问题,您可以向SQL语句添加额外条件,以便仅在该部门有余数时添加1

更改此

$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()";

到这个

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

请参阅Modulo "%" operation

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

<小时/> 编辑: 您可以像这样

计算应用层(PHP)的select (CASE WHEN floor(count(1)%$itemsperpage) THEN floor(count(1)/$itemsperpage)+1 ELSE floor(count(1)/$itemsperpage) END)
$pagesNumber