PHP+Ajax+Datatables实现分页

效果如上图所示,之前对于这个插件一直都不太懂,今天写了一下很多东西都是固定的,只是里面的参数比较复杂且不易理解。建议去官方文档查看参数的意义。虽然没有看源码是如何填充的,但是从后台来看分页还是与PHP分页类似。PHP分页是传递一个参数page,确定偏移量然后从数据库取值将其循环输出到表格中。而这个插件是将选择的页面和每一页展开的条数通过ajax传递给后台,后台是直接将数据库中的数据全部取出来放到数组中,由页面和条数通过array_slice这个函数将数据放到数组中,然后json_encode()再传递给前端,前端直接填充展示。

值得注意的是,传递回前端的数组的参数是固定的,不然就会返回参数错误,如下图所示


前端代码如下(有详细注释)

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>测试页面</title>
    <meta name="description" content="">
    <meta name="keywords" content="">
    <link href="DataTables-1.10.12/media/css/jquery.dataTables.min.css" rel="stylesheet">
    <link href="DataTables-1.10.12/media/css/dataTables.bootstrap4.min.css" rel="stylesheet">
    <link rel="stylesheet" type="text/css" href="bootstrap.css">
    <script src="http://code.jquery.com/jquery-2.0.0.min.js"></script>
    <script type="text/javascript" language="javascript" src="DataTables-1.10.12/media/js/jquery.dataTables.js"></script>
    <style type="text/css">
        #example{
            text-align: center;
        }
    </style>
</head>
<body>
<div style="width:100%;margin:0px auto  ;background-color: #f5f5f5">
<table id="example" class="table table-striped table-hover table-bordered" width="100%" align="center">
    <thead>
    <tr>
        <th>Name</th>
        <th>Cellphone</th>
        <th>Position</th>
        <th>Company</th>
        <th>Salary</th>
        <th>test</th>
        <th>Id</th>
    </tr>
    </thead>
    <tbody>

    </tbody>
</table>
</div>

<script type="text/javascript">
    $(document).ready(function() {
        refreshDataTable();
    });

 var refreshDataTable=function() {
     var table = $('#example').DataTable({
         "sPaginationType": "full_numbers",
         'language': {  
                'emptyTable': '没有数据',  
                'loadingRecords': '加载中...',  
                'processing': '查询中...',  
                'search': '检索:',  
                'lengthMenu': '每页 _MENU_ 条',  
                'zeroRecords': '没有数据',  
                // 'paginate': {  
                //     'first':      '第一页',  
                //     'last':       '最后一页',  
                //     'next':       '下一页',  
                //     'previous':   '上一页'  
                // },  
                'info': '第 _PAGE_ 页 / 总 _PAGES_ 页',  
                'infoEmpty': '没有数据',  
                'infoFiltered': '(过滤总件数 _MAX_ 条)'  
            },
         "searching":false,
         "bPaginite": true,
         "bInfo": true,
         "bSort": false,
         "processing": false,
         "bServerSide": true,
         "sAjaxSource": "page.php",//这个是请求的地址
         "fnServerData": retrieveData// 获取数据的处理函数

     });
     function retrieveData(url, aoData, fnCallback) {
         $.ajax({
             url: url,//这个就是请求地址对应sAjaxSource
             data : {
                 "aoData":JSON.stringify(aoData)
             },
             type: 'POST',
             dataType: 'json',
             async: true,
             success: function (result) {
                 fnCallback(result);//把返回的数据传给这个方法就可以了,datatable会自动绑定数据的
             },
              error:function(XMLHttpRequest, textStatus, errorThrown) {
                 alert("status:"+XMLHttpRequest.status+",readyState:"+XMLHttpRequest.readyState+",textStatus:"+textStatus);

             }
         });
     }
 };
</script>
</body>
</html>
后台PHP页面

<?php
    header('Content-type: text/html; charset=utf8');
    require_once ('conf.php');
    $res = $_POST['aoData'];
    $iDisplayStart = 0; // 起始索引
    $iDisplayLength = 0;//分页长度
    $jsonarray= json_decode($res) ;
    foreach($jsonarray as $value){ 
        if($value->name=="sEcho"){
            $sEcho=$value->value;
        }
        if($value->name=="iDisplayStart"){
            $iDisplayStart=$value->value;
        }
        if($value->name=="iDisplayLength"){
            $iDisplayLength=$value->value;
        } 
    }
    $data = array();
    $Array = Array(); 
    $mysqli = new mysqli($db_host,$db_user,$db_passwd,$db_name);
    $mysqli->query("SET NAMES utf8mb4");
    if (mysqli_connect_errno()) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }
    $sql = "select * from postback";
    $result = $mysqli->query($sql);
    $count = $result->num_rows;
    while($row = $result->fetch_array()) {
        $data = array($row["id"],$row["cid"],$row["platform"],$row["device_id"],$row["ip"],$row["device_type"],$row["create_time"]);
        Array_push($Array,$data); 
    }
      $json_data = array ('sEcho'=>$sEcho,'iTotalRecords'=>$count,'iTotalDisplayRecords'=>$count,'aaData'=>array_slice($Array,$iDisplayStart,$iDisplayLength));  //按照datatable的当前页和每页长度返回json数据
      $obj=json_encode($json_data);
      echo $obj;
?>


  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用方法: 支持JAVA和PHP两种后台。 PHP:直接将WebRoot下的文件放到php服务器上直接运行即可,记得启用sqlite3。 JAVA:修改user-manage.js,将访问后台的url由"datasource.php"改为"datasource.jsp",然后将WebRoot下的文件放到tomcat下直接运行。也可使用Eclipse直接导入此项目文件。 简要说明: 使用DataTable默认的ajax交互功能,对传给后台和从后台获取的数据都有命名格式要求,这样一来耦合度较高,不利于后期扩展,不能直接适用于需要跟多种不同前端或其他业务交互的项目。本例子主要展示了自行封装请求参数和返回数据的用法,对后台的交互没有任何格式和命名限制。 基于Bootstrap 2.3.2,相关的其他插件包括图标控件FontAwesome、等待提示控件Spinjs(修改版)、弹窗控件lhgdialog(修改版) 主要展现: 封装请求参数(查询、排序、分页,不再需要data、dataFilter和dataSrc) 封装返回数据 自定义查询参数 服务器分页 自行控制和自定义遮罩效果 生成自定义效果的单元格(在线离线) 生成复选框单元格 响应复选框选择事件 生成操作按钮单元格 响应操作栏按钮点击事件 响应行点击事件 渲染回调事件(默认选中第一行) 分页栏增加跳页功能(直接修改了dataTables.bootstrap.jsdataTables.bootstrap.css) CSS实现单元格超长文字省略号显示 CSS实现单元格连续纯字母数字强制换行显示

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值