我有一个Ajax调用来创建一个图库。有一个组合框可以设置每页的图像数量,以及用于浏览页面的分页。它工作正常,除了如果一个人在最后一页,并且他们增加每页的图像数量,它将重新加载到当前页码。这是一个问题,因为现在页面较少,因此页面为空白。换句话说,您最终会以page 7 of 5
结束。
我认为问题出在PHP中,因为这是计算页数的地方。我已经考虑过if
声明来解决这个问题:
if ($page > $no_of_paginations) {
$page = $no_of_paginations;
}
但是,我不知道放在哪里。原因是,$page
需要在 mysql_query之前定义,但{<1}}在查询后定义。
关于如何实现这一功能的任何想法?
我将在下面发布相关代码:
$no_of_paginations
感谢您的帮助!
答案 0 :(得分:2)
正如您目前所做的那样,将最后一部分移到主查询上方是没有问题的。
使用MySQL查找总记录的更好方法是在主查询中使用SQL_CALC_FOUND_ROWS关键字(所以这里是SELECT SQL_CALC_FOUND_ROWS imgURL, imgTitle FROM images WHERE etc
)然后您可以查询SELECT FOUND_ROWS()
并获取在上一个查询中找到的记录数。除了更快,更高效之外,这还可以避免在两个查询之间添加记录时的竞争条件。
但是,在这种情况下,您可能只是以相反的顺序执行两个当前查询,因为您唯一的另一个选项是最后检查并在必要时重复。
答案 1 :(得分:1)
您应该使用查询:
$query_pag_data = "SELECT SQL_CALC_FOUND_ROWS `imgURL`,`imgTitle` FROM `images` ".
"ORDER BY `imgDate` DESC LIMIT $start, $per_page";
而不是
$query_pag_num = "SELECT COUNT(*) AS count FROM images";
使用
$query_pag_num = "SELECT FOUND_ROWS()";
答案 2 :(得分:0)
如果您在脚本中先前执行“SELECT COUNT(*)...”查询(至少在其他查询之前),您之前会有$ no_of_paginations,并且可以使用它将$ page压缩到正确的范围
答案 3 :(得分:0)
有时你只需要咬紧牙关并进行两次查询。接受用户提供的“我想要页面X”值,并尝试获取该特定页面。如果它最终超过可用数据的末尾,您可以说“嘿,等等......这是不对的”并中止,或者重做循环并默认为最后一个可用页面。
while(true) {
$sql = "select sql_calc_found_rows .... limit $X,$Y";
$result = mysql_query($sql) or die(mysql_error());
$sql = "select found_rows();"; // retrieve the sql_calc_found_rows_value
$res2 = mysql_query($sql);
$row = mysql_fetch_array($res2);
$total_rows = $row[0];
if ($total_rows < $requested_row) {
... redo the loop and request last possible page ...
} else {
break;
}
}
有关found_rows()函数here的详细信息。