【问题标题】:How to handle pagination for MySQL result returned to jQuery/JSON object如何处理返回给 jQuery/JSON 对象的 MySQL 结果的分页
【发布时间】:2013-03-12 11:09:45
【问题描述】:

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

$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>' +
...

(如您所见,这是完整输出的不完整 sn-p)

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

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

此时我想知道两件事:

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

或:

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

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

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

感谢大家的帮助。

【问题讨论】:

    标签: php mysql jquery-pagination


    【解决方案1】:

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

    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."
    

    希望这会有所帮助。

    【讨论】:

    【解决方案2】:
    // 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      • 2020-09-06
      • 2017-02-19
      • 2018-10-01
      • 1970-01-01
      • 2012-04-18
      • 2015-05-21
      相关资源
      最近更新 更多