Datatables()-通过MySQLi中的AJAX在PHP中进行分页

Armitage2k

好吧,我对此感到茫然。我四处搜寻,阅读了手册(它的语法完全不同,只提供了PDO示例),并且在此上花了太多时间,因为我想使其在AJAX中工作,因为这样做是正确的

因此,我显然有一个包含大量记录的数据表,并且正在努力使分页正常工作,搜索和排序所有工作正常。

遵循手册,我可以通过使用LIMITSQL查询上命令来收集处理分页的信息,然后命令再次从$_REQUEST变量获取行数,并相应地修改查询以显示正确start, end的行数。

我的问题现在似乎是datatables()确实正确地计算了应该显示的行数(例如100的25),但随后却没有分页,这使我停留在第一页上,具有相同的25个条目。

这应该很简单,并且在进行传统的POST提交时即开即用,但是在处理AJAX调用时,这似乎变得越来越困难...。

感谢我准备放弃的任何帮助。谢谢

Javascript:

  <script type="text/javascript" language="javascript" class="init">                    
    $(document).ready(function() {
        $('#med_feedback').DataTable( {
            // load table data via AJAX
            "processing": true,
            "serverSide": true,
            "ajax":{
                url: "../../plugins/MySQL/ajax_action.php", // json datasource
                data: { action:"view_med_surveys", property: $("#property_select").val(), date: $("#daterangepicker").val() },
                type: "POST",   // connection method (default: GET)
            },
            "columns": [
                { "aaData": "Svy_ID" },
                { "aaData": "OSAT" },
                { "aaData": "INT" }    
            ],
            columnDefs: [
                {   // adjust survey output
                    targets: [0],
                    render: function (data, type, row, meta) {
                        var Svy_ID = row[0];    // define Survey as a variable since array is an object

                        return '<a href="#" data-toggle="modal" data-target="#DetailSurveyModal" data-keyboard="true" data-id="' + Svy_ID +'">' + Svy_ID + '</a>';
                    },
                }
            ],
            select: {
              style: 'single',
              //items: 'cell'
            },
            dom: 'Bfrtip',
            stateSave: true,
            buttons: [
              'copyHtml5',
              'excelHtml5',
              'csvHtml5',
              'pdfHtml5',
              {
                extend: 'print',
                message: 'DO NOT DISTRIBUTE'
              },
              {
              extend: 'collection',
              text: 'Others',
              buttons: [
                {
                  text: 'Toggle button',
                  action: function ( e, dt, node, config ) {
                  dt.column( -4 ).visible( ! dt.column( -4 ).visible() );
                  }
                },
                'colvis',
                'columnsToggle',
              ]
              },
            ],
            "pagingType": "full_numbers",
            "pageLength": 25,
            "lengthChange": true,
            "searching": true,
            "ordering": false,
            //"order": [[ 1, "asc" ], [ 3, "asc" ]],
            "info": true,
            "autoWidth": true
        })
    });
  </script>

服务器端PHP:

if(isset($_POST['action']) && ($_POST['action'] == 'view_med_surveys')) {

    if(isset($_SESSION['Access'])) {

        // Start MySQLi connection
        include 'connect_db.php';
        $db = new mysqli($dbhost,$dbuser,$dbpass,$dbname);

        // display error if connection cannot be established
        if($db->connect_errno > 0){
        die('Unable to connect to database [' . $db->connect_error . ']'); }

        // define variables
        $requestData = $_REQUEST;       // DataTables AJAX request  
        $property = mysqli_real_escape_string($db,$_POST['property']);
        $med_date = str_replace(" - ","' AND '", mysqli_real_escape_string($db,$_POST['date']));

        // check if table exists
        $result = $db->query("SELECT `Survey ID` FROM `medallia_import_".$property."` WHERE WHERE DATE(`Survey Collected Date 1`) BETWEEN '".$med_date."' LIMIT 1");
        //if ($result->num_rows > 0) {      // if at least one record is found, proceed accordingly

            // show all records
            $sql = "SELECT `Survey ID`, `Overall Experience`, `Internet Service` FROM `medallia_import_".$property."` WHERE DATE(`Survey Collected Date 1`) BETWEEN '".$med_date."'";

            // run query to get total number of records
            $result = $db->query($sql) or die(mysqli_error($db));
            $totalData = $result->num_rows;

            // if there is a search parameter, $requestData['search']['value'] contains search parameter
            if( !empty($requestData['search']['value']) ) {
                $sql.=" AND ( `Survey ID` LIKE '".$requestData['search']['value']."%' ";
                $sql.=" OR `Overall Experience` LIKE '".$requestData['search']['value']."%' ";
                $sql.=" OR `Internet Service` LIKE '".$requestData['search']['value']."%' ";
            }

            // sort by collection date - NO PAGINATION
            $sql.=" ORDER BY `Survey Collected Date 1` DESC LIMIT ".$requestData['start'].", ".$requestData['length']." ";
            //$sql.=" ORDER BY `Survey Collected Date 1` DESC";      // this works

            // run final query
            $result = $db->query($sql) or die(mysqli_error($db));

            if($result->num_rows > 0) {
                // return total number of rows for pagination
                $totalFiltered = $result->num_rows;

                // return table data - MUST BE NON-ASSOCIATIVE ARRAY
                while($row = mysqli_fetch_array($result)) {
                    $data[] = array(
                        $row['Survey ID'],
                        $row['Overall Experience'],
                        $row['Internet Service']
                    );
                }

                // finalize array with elements required by DataTable plugin
                $json_data = array(
                  "draw"            => intval( $requestData['draw'] ),  // unique draw number identifier (required)
                  "recordsTotal"    => intval( $totalData ),            // total number of records
                  "recordsFiltered" => intval( $totalFiltered ),        // total number of records after searching, if there is no searching then totalFiltered = totalData
                  "success"         => true,                            // success message - false / true (required)
                  "aaData"          => $data                            // table data as array
                );

                echo json_encode($json_data);
            } else {
              echo "No data found";
            }
    }
}
Armitage2k

找到了。问题是我用来对totalFiltered变量进行计数的查询已经具有分页限制,因此$result->num_rows计数始终为25。

我通过将SQL查询的最后部分分成2位($ sql 1 + $ sql2)来规避此问题,一个查询没有可用于计数的限制元素,另一个查询具有可用于限制的元素DT结果。

// if there is a search parameter, $requestData['search']['value'] contains search parameter
if( !empty($requestData['search']['value']) ) {
    $sql.=" AND ( `Survey ID` LIKE '".$requestData['search']['value']."%' ";
    $sql.=" OR `Overall Experience` LIKE '".$requestData['search']['value']."%' ";
    $sql.=" OR `Internet Service` LIKE '".$requestData['search']['value']."%' ";
}

// remove LIMIT for accurate DataTables row count
$sql2 = $sql . " ORDER BY `Medallia Collected Date 1` DESC";      // use for totalFiltered

// order Datatables result by date and apply pagination
$sql.=" ORDER BY `Medallia Collected Date 1` DESC LIMIT ".$requestData['start'].", ".$requestData['length'];

// run final query
$result = $db->query($sql) or die(mysqli_error($db));

if($result->num_rows > 0) {

    // return total number of rows for pagination
    $result2 = $db->query($sql2) or die(mysqli_error($db));
    $totalFiltered = $result2->num_rows;

...

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用dataTables还是在Rails中进行过滤和分页?

来自分类Dev

通过DataTables.net进行分页的图像和标题

来自分类Dev

jQuery Datatables分页设置

来自分类Dev

与DataTables分页所需的页面

来自分类Dev

Bootstrap DataTables 的分页与分页的区别

来自分类Dev

DataTables Bootstrap分页不呈现

来自分类Dev

jQuery Datatables 加载数据 ajax

来自分类Dev

jQuery datatables Ajax错误/ http://datatables.net/tn/7

来自分类Dev

淘汰JS和DataTables Ajax和PHP

来自分类Dev

淘汰JS和DataTables Ajax和PHP

来自分类Dev

等效于Datatables 1.10.2中的Datatables iSortCol_0?

来自分类Dev

汇总DataTables中的过滤列

来自分类Dev

克隆DataTables中的选定行?

来自分类Dev

在 DataTables 表中嵌入操作

来自分类Dev

从 DataSet 中的 DataTables 输出数据

来自分类Dev

使用DataTables进行服务器端分页

来自分类Dev

在DataTables的单个下拉列表中进行多列过滤

来自分类Dev

DataTables使分页和显示计数显示在顶部

来自分类Dev

DataTables使分页和显示计数显示在顶部

来自分类Dev

DataTables在.php文件中不起作用

来自分类Dev

如何在jQuery Bootstrap DataTables插件中居中分页?

来自分类Dev

如何删除jQuery DataTables分页中的省略号?

来自分类Dev

jQuery DataTables插件:对德语日期进行排序

来自分类Dev

如何使用正交数据对DataTables进行排序?

来自分类Dev

Bower:下载DataTables插件以进行引导集成

来自分类Dev

jQuery DataTables插件:对德语日期进行排序

来自分类Dev

如何按日期对 DataTables 行进行排序?

来自分类Dev

通过DataTables JQuery覆盖Bootstrap Popover

来自分类Dev

jQuery DataTables Ajax数据源的问题