我有一个文章系统,这是由几个用户使用。文章有它们自己的权限,根据我的while循环中运行的每篇文章的浏览者ID进行检查。如果允许用户查看文章,我通过递增$printcount来限制文章,循环在到达$limit时终止。我也有排序选项,按名称、插入日期、修改日期和提交者排序。
如何在不使用MySQL limit功能的情况下使用下一页/上一页按钮?这是我的代码的一个简短版本(可能不是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,但由于有不同的排序选项和方向选项,这似乎要复杂得多。
发布于 2012-02-23 02:40:13
我假设你问这个问题是因为你的权限模型是在php应用程序中处理的,这会阻止你在查询中轻易地使用LIMIT。
您应该将每个用户的权限存储在数据库表中,然后使用联接,以便只检索用户可以查看的项目。这样,您就不必在应用程序中处理分页或排序逻辑;您只需使用mysql中的LIMIT和ORDER BY就可以了。
此外,您可能应该使用基于参数的查询。您的代码有一个巨大的sql注入漏洞。
发布于 2012-02-23 05:28:50
良好(稳定,快速)的分页不使用偏移量,但保持限制,因此用户可以从一个页面移动到另一个页面,响应时间不会增加,因为他们移动到更多的页面这个文档非常有教育意义(使用MySQL,但主要思想也可以在其他数据库管理系统中考虑)。
https://stackoverflow.com/questions/9400665
复制相似问题