我在MySQL数据库中有一个新闻表我查询表并在一个PHP页面中显示新闻的标题,但现在表格越来越大,所以我想将结果分成页面,我的意思是显示每个50个新闻标题一页(pagenation)。 我使用此查询来传达新闻:
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查询的最大值和最小值是不对的?我应该更正此代码中的内容吗?
答案 0 :(得分:2)
如docs中所述,LIMIT
子句采用偏移和计数参数。因此,如果您希望获得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);
答案 1 :(得分:0)
您需要设置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;
}
答案 2 :(得分:0)
正确的代码是:
$news_per_page = 50;
if(!empty($_GET['p_n']))
{
$p_n = intval($_GET['p_n']);
$min = ($p_n-1) * $news_per_page;
$max = $news_per_page;
}
else
{
$p_n = 1;
$max = 50;
$min = 0;
}
$news = all_news($max,$min);
虽然$ _GET ['p_n']是page_number,但你不需要进行任何乘法
答案 3 :(得分:0)
如果你在处理分页时遇到问题,我建议你使用一些有效的代码,例如一个带有三个参数的分页类:
然后该类将为您生成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