不带LIMIT语句和排序的页面计数


Page numeration without LIMIT statement and with sorting

我有一个供几个用户使用的文章系统。文章有自己的权限,在while循环中运行的每一篇文章都会根据查看器的ID进行检查。如果允许用户查看文章,我通过递增$printcount来限制文章,当循环到达$limit时,循环终止。我还有排序选项,可以按名称、插入日期、修改日期和提交日期进行排序。

如果不使用MySQL限制功能,我该如何使用下一页/上一页按钮?这是我的代码的一个简短版本(可能不是100%功能性的,但应该能说明问题)

<?php
$sort=$_GET['sort']; // date_added
$direction=$_GET['dir']; // ASC
$limit=$_GET['limit']; // 25
$query="SELECT * FROM `article` ORDER BY '$sort' '$direction'";
$result=mysql_query($query);
if(mysql_num_rows($result)==NULL) {
  echo '<tr><td colspan="4">NO RECORDS FOUND</td></tr>';
}
$printcount=0;
while(($row=mysql_fetch_assoc($result))&&($printcount<$limit+1)) {
  //if user is owner of article $readable=true;
  //load permissions from permission column (comma separated integers) into array, if user's group ID is in that array $readable=true;
  //if article "global_read" flag=1, $readable=true;
  //if $printcount<$limit, and $readable echo the table row with data
  //if $readable, $printcount++;
}
?>

如果我只按ID ASC排序,我可以很容易地将ID存储为last_id,在下一页上,查询将有一个额外的:WHERE `id`>$last_ID,但由于有不同的排序选项和方向选项,这似乎要复杂得多。

我假设您问这个问题是因为您的权限模型是在php应用程序中处理的,它使您无法在查询中轻松使用LIMIT。

您应该将每个用户的权限存储在数据库表中,然后使用联接,以便只检索用户可以查看的文章。这样就不必处理应用程序中的分页或排序逻辑;您只需在mysql中使用LIMIT和ORDERBY即可完成此操作。

此外,您可能应该使用基于参数的查询。您的代码有一个巨大的sql注入漏洞。

好的(稳定、快速)分页不使用OFFSET,但保持LIMIT,这样用户就可以从一页移动到另一页,响应时间不会随着移动到更多页而增加本文档对分页非常有教育意义(使用MySQL,但在其他dbms中也可以考虑其主要思想)。

MySQL 中的分页