javascript - JqG​​rid 分页器在每个页面加载相同的数据

标签 javascript php jqgrid

数据按我的预期加载。页数也算在内。但是当我更改页码时,会出现相同的数据。

这是 jQgird 代码:

$("#list").jqGrid({
        url: "classes/classesController.php",
        datatype: "json",
        mtype: "POST",
        postData: {method:"getLogsList"},
        colNames: ["Id","Ip", "Hostname", "Log", "Ημ/νια"],
        colModel: [
            { name: "log_id", index:"log_id", width: 100, sortable:false, hidden:true},
            { name: "ip", index: "ip", width: 130, searchoptions:{sopt:['eq']} },
            { name: "hostname", index:"hostname", width: 180 , searchoptions:{sopt:['eq']}},
            { name: "log", index:"log", width: 180, align: "right", searchoptions:{sopt:['eq']}},
            { name: "date", index:"date", width: 180, align: "right", searchoptions:{sopt:['eq']}}
        ],
        jsonReader: { root: "rows", page: "page", total: "total", records: "records", repeatitems: true, cell: "cell",  id: "id",},
        caption: "Logs",
        gridview: true,
        rownumbers: true,
        height: 'auto',
        shrinkToFit: false,
        rowNum:2,
        pager: '#gridpager'
    }); 

这里是 php 部分:

init_mysql();

        $response = new stdClass();


        // Getting pages number (for jqGrid pager)

        if(!$sidx) $sidx =1;
        $result = mysql_query("SELECT COUNT(*) AS count FROM logs");
        $row = mysql_fetch_array($result);
        $count = $row['count']; 

        if( $count >0 ) {
            $total_pages = ceil($count/$limit);
        } else {
            $total_pages = 0;
        }

        if ($page > $total_pages) $page=$total_pages;
        $start = $limit*$page - $limit;

        $response->page = $page;
        $response->total = $total_pages;
        $response->records = $count;


        // Getting data for jqGrid table

        $data =  mysql_query("SELECT * FROM logs ORDER BY log_id DESC");
        $i = 0;

        if(mysql_num_rows($data))
        {
            while($row = mysql_fetch_array($data)) 
            { 

                $response->rows[$i]['id']=$i+1; 

                $response->rows[$i]['cell']=array('log_id'=>$row['log_id'],'ip'=>$row['ip'],'hostname'=>$row['host'],'log'=>$row['input'],'date'=>$row['date']);

                $i++;
            }   
        }

        echo json_encode($response);

为什么会发生这种情况?正如我在请求中看到的那样,一切正常。 第一页变成了第二页,依此类推..

method=getLogsList&_search=false&nd=1371379260922&rows=33&page=2&sidx=&sord=asc

最佳答案

简短的回答是:您应该添加 loadonce: true选项来解决问题或更改服务器代码以实现服务器端分页。

jqGrid支持服务器端和客户端两种分工方式。旧版本的jqGrid(3.7版本之前)仅支持服务器端数据分页、排序和过滤。您不使用loadonce: true选项,因此您应该遵守协议(protocol):

  • jqGrid 发送到服务器(到 url )参数 rows , page , sidxsord 。例如sidx=ip , sord=asc , rows=10 , page=2 。这意味着服务器必须按ip对完整数据集进行排序。 ASC 中的专栏排序并仅返回数据的第二页 ( page=2 )。页面大小由 rows 定义范围。如果rows=10那么必须跳过前 10 个项目并返回接下来的 10 个项目(如果项目总数小于 20,则返回更少的项目)。确切的 SQL 语句取决于您使用的 SQL 服务器。可以使用LIMIT , TOP等等建筑。返回的数据应包含records - 项目总数,total - 根据页面大小计算的页数 rowspage服务器响应的内容是可选的。通常,它与请求的页码相同,但通常服务器可以检测到项目总数的变化并返回另一个页面。例如,如果用户请求第 100 页,而其中只有 7 页,则服务器可以检测到问题并返回过去的页码 7。在这种情况下,属性 page服务器响应的值应设置为 7 - 返回的页面数。

如果您需要在不太大的网格中显示数据集(例如几百个项目),那么使用 loadonce: true 可能会更有效jqGrid 的选项。在这种情况下,服务器应该仅对数据进行排序并返回所有排序的项目。第一次加载后datatype网格选项将自动更改为 "local" 。 jqGrid仅显示返回数据的第一页,但它包含所有返回的项目。后面的排序、分页和搜索/过滤将在本地实现,无需与服务器进行任何通信。由于现代网络浏览器的 JavaScript 引擎非常快,因此对相对较大的数据集进行分页可能比向服务器发送请求要快得多。

关于javascript - JqG​​rid 分页器在每个页面加载相同的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17132711/

相关文章:

javascript - 带有PNG文件的AngularJS素材图标

php - Paypal API NVP 错误消息 : Item name, 如果提供项目类别,则需要金额和数量

php - 使用 php 访问文本文件?

php - laravel4 Composer 安装遇到 proc_open 不可用错误

javascript - 如何在内联Jqgrid中仅添加一行

jqgrid - 如何隐藏在 ExpandNode 事件后触发的 jqGrid 树网格中的行?

jquery - 如何在内联编辑jqgrid中的onSelectRow中将焦点设置在特定单元格上

javascript - Bootstrap 4 崩溃不适用于 jquery 缩小版

javascript - 如何使用 JSON.parse() 显示正确的值?

javascript - 使用 Lodash 比较、匹配和过滤两个对象