【问题标题】:Datatables() - pagination in PHP via AJAX in MySQLiDatatables() - 在 MySQLi 中通过 AJAX 在 PHP 中分页
【发布时间】:2019-11-01 11:38:22
【问题描述】:

好的,我对这个不知所措。我已经搜索了所有内容,阅读了手册(它具有完全不同的语法,并且只给出了 PDO 示例)并且通常在这方面花费了太多时间,只是因为我想让它在 AJAX 中工作 因为它是正确的去做

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

按照手册,我可以收集到分页是通过在 SQL 查询中使用 LIMIT 命令来处理的,然后再次从 $_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";
            }
    }
}

【问题讨论】:

    标签: php ajax datatables


    【解决方案1】:

    在您的响应数组中,不应该将其称为 "data" 而不是 "aaData" 吗?我找不到你设置“dataSrc”属性,以便它使用“aaData”而不是“data”。

    除此之外,请检查您的 recordsTotalrecordsFiltered 值,以查看所有查询是否确实按预期工作。

    【讨论】:

      【解决方案2】:

      找到了。问题是我用来计算 totalFiltered 变量的查询已经设置了分页限制,因此 $result-&gt;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;
      
      ...
      
      }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-02
      • 2018-01-23
      • 2013-05-14
      • 1970-01-01
      • 2014-12-08
      • 2015-12-08
      • 2011-10-20
      相关资源
      最近更新 更多