0

我有一个查询,目前看起来像这样:

$queryMovies = "SELECT
    m.movieID,
    n.title,
    m.directorID, d.directorFirstName, d.directorLastName,
    m.runTime,
    m.yearReleased,
    m.synopsis,
    m.formatID, f.format,
FROM movies m
LEFT JOIN directors d ON d.directorID = m.directorID
LEFT JOIN format f ON f.formatID = m.formatID
ORDER BY title";

结果被发送回 jQuery $.ajax 调用,如下所示:

$arr = array();

while($row = mysqli_fetch_array($resultMovies, MYSQLI_ASSOC)) {
    $arr[] = $row;
}
header('Content-Type: application/json');
echo json_encode($arr);

$.ajax 调用的成功函数处理数据如下:

...
'<div class="synopsisCell">' +
    'Synopsis<br />' +
    '<label class="lblSynopsis">' + element['synopsis'] + '</label>' +
'</div>' +
'<div class="formatCell">' +
    '<label class="lblFormat">' + element['format'] + '</label>' +
'</div>' +
'<div class="yearCell">' +
    '<label class="lblYear">' + element['yearReleased'] + '</label>' +
'</div>' +
...

(如您所见,这是完整输出的不完整片段)

我需要将分页添加到要放入数据的表中,但我不确定处理此问题的最佳方法。(我以前从未使用过分页编程)

我开始添加一个单独的查询,它只获取记录数(以确定将有多少页),然后我意识到我仍然需要使用分页的开始和记录数等执行一个 LIMIT 子句,等等。

在这一点上,我想知道两件事:

A)我能否以某种方式将记录数添加到现有的查询/返回代码中,然后我可以在 jQuery 端使用它来构建分页导航(页码和下一页/上一页/第一页/最后一页链接)。

或者:

B)我是否可以通过从 JSON 对象以某种方式获取记录数并仅显示要在表中显示的结果集(例如,哪组 20 条记录)来完全在 JS 端处理分页?

此外,当用户单击分页导航链接时,我是否每次都必须重新运行查询,或者是否有某种方法可以在 JS 中“存储”该信息以避免过多的服务器/数据库查询?

我不是在寻找特定的编码,只是可能一些伪代码让我朝着正确的方向开始。

感谢任何人的帮助。

4

2 回答 2

1

A) 可以使用一个查询返回计数和有限的结果SQL_CALC_FOUND_ROWS。出于性能原因,使用两个单独的语句可能会更快。

B) 这也是可能的。您可以获得所有结果并根据页面隐藏/取消隐藏结果,甚至在选择新页面时不会重新加载浏览器。如果您期望一个大的结果集,这可能是一种昂贵的方法。

如果你想在数据库端限制你的结果:

// query, get result count
$count = ... COUNT(*)

// for pagination
$results_per_page = 20;  // arbitrary number
$total_pages = ceil($count / $results_per_page);
if(isset($_GET['page_num']) && $_GET['page_num'] > 0) {
  $page_num = $_GET['page_num']; // for example 2
}
else {
  $page_num = 1;
}
$upper_limit = $results_per_page * $page_num;
$lower_limit = $upper_limit - $results_per_page;

// query limited results
... LIMIT ".$lower_limit.", ".$results_per_page."

希望这可以帮助。

于 2013-03-10T23:29:59.647 回答
0
// on php
// $page, default is 1
$page = isset($_GET['page']) : $_GET['page'] : 1;
// $rows in page, default is 20
$limit = isset($_GET['limit']) : $_GET['limit'] : 20;
$offset = ($page - 1) * $limit;
$queryMovies = "SELECT
    m.movieID,
    n.title,
    m.directorID, d.directorFirstName, d.directorLastName,
    m.runTime,
    m.yearReleased,
    m.synopsis,
    m.formatID, f.format,
FROM movies m
LEFT JOIN directors d ON d.directorID = m.directorID
LEFT JOIN format f ON f.formatID = m.formatID
ORDER BY title
LIMIT $offset, $limit";

// can't remember if this going to work but this should
// give you an idea
$arr['config'] = array('current_page' => $page, 'limit' => $limit, 'total_number_of_rows' => 10000);

// do the json encoding

// in javascript you should use the info of
// the current_page to tell the user in what page he is
// using total_number_of_rows and limit, calculate the pages and show them to the
// user so he knows how many pages there are
于 2013-03-10T22:49:29.730 回答