我在MySQL数据库中有一个新闻表,我查询这个表并在一个PHP页面中显示新闻标题,但是现在这个表越来越大,所以我想将结果分成几页,我的意思是在一页中显示每50个新闻标题(分页)。我使用这个查询带来了以下消息:
SELECT news.*, categories.category, users.username
FROM news INNER JOIN
users on news.user_id = users.id INNER JOIN
categories on categories.id = news.category_id
order by news.timestamp DESC
limit $min,$max这是PHP页面的一部分(我是如何计算最大和最小的)
$news_per_page = 50;
if(!empty($_GET['p_n']))
{
$p_n = $_GET['p_n'];
$max = $news_per_page*$p_n;
$min = ($max - $news_per_page);
}
else
{
$p_n = 1;
$max = 50;
$min = 0;
}
$news = all_news($max,$min);当我通过限制时,sql给了我错误的结果,我不知道原因。用这种方式指定sql查询的最大值和最小值是错误的吗?我应该纠正这段代码中的某些内容吗?
发布于 2014-05-03 11:59:27
如果您在正确处理分页时遇到问题,我建议您使用一些正在工作的代码,例如,使用三个参数的分页类:
然后该类将为您生成LIMIT子句。示例:
$pageNumber = 1;
$totalCount = 17;
$perPage = 5;
$pagination = new LimitPagination($pageNumber, $totalCount, $perPage);
echo $pagination, "\n";这将输出
LIMIT 0, 5因为你在第一页。这样一个类也可以过滤掉你在这里遇到的问题,例如设置为一个负面的页面--只是自动的。此外,它还可以提供大量额外的数据,例如下一页和前一页、当前页、总页数,如果是第一页或最后一页,或者不是:
$pagination->setPage(-2);
echo $pagination, "\n";
echo "Current: ", $pagination->getPage(),
"; Total: ", $pagination->getTotalPages(),
"; Previous: ", $pagination->getPreviousPage(),
"; Next: ", $pagination->getNextPage(),
"\n";输出:
LIMIT 0, 5
Current: 1; Total: 4; Previous: 1; Next: 2这样就很容易与不同的代码集成,包括您的代码:
$pagination = new LimitPagination($_GET['p_n'], $totalCount, 50);
$limit = sprintf("%d, %d", $pagination->getOffset(), $pagination->getCount());这应该很容易做到。类以Gist:https://gist.github.com/4469154的形式出现
发布于 2014-05-03 12:05:04
正如在LIMIT中所解释的那样,文档子句接受参数、偏移量和count。因此,如果您想得到,例如,从201到250的结果,您可以使用LIMIT 200, 50。首先,将变量$min和$max重命名为$offset和$count,然后一切都就位。
伪码:
offset = (requestedPageNumber - 1) * rowsPerPage;
count = rowsPerPage;PHP代码:(假设页码为0)
$rowsPerPage = 50;
$page = empty($_GET['p_n']) ? 0 : $_GET['p_n'];
$offset = $rowsPerPage * (int) $page;
$news = all_news($offset, $rowsPerPage);发布于 2014-05-03 11:55:56
您需要设置start (这可以通过使用当前页和每个页面属性来实现),第二个信息是您需要多少结果(同样是每个页面属性)。
LIMIT . ($p_n - 1) * $news_per_page .', ' . $news_per_page因此,在您的脚本中,它将是:
if(!empty($_GET['p_n']))
{
// You need to protect your variables for SQL injection. For numbers (int) or integer() function it is enough.
$p_n = (int) $_GET['p_n'];
$max = (int) $news_per_page;
$min = (int) ($p_n - 1) * $news_per_page;
}
else
{
$p_n = 1;
$max = 50;
$min = 0;
}https://stackoverflow.com/questions/23443997
复制相似问题