Datatables () - разбиение на страницы в PHP через AJAX в MySQLi - PullRequest
0 голосов
/ 01 ноября 2019

ОК, я в растерянности с этим. Я обыскал все, прочитал руководство (которое имеет совершенно другой синтаксис и дает только примеры PDO) и вообще потратил слишком много времени на это только потому, что хочу заставить его работать в AJAX , потому что это правильночтобы сделать

Итак, у меня, очевидно, есть таблица данных с большим количеством записей, и я изо всех сил стараюсь, чтобы нумерация страниц работала, поиск и упорядочивание всех работ нормально.

Следуя инструкции, яМожно узнать, что разбиение на страницы выполняется с помощью команды LIMIT в запросе SQL, которая затем снова получает количество строк из переменной $_REQUEST, соответственно изменяя запрос, чтобы отобразить правильное число строк start, end.

Моя проблема сейчас заключается в том, что datatables () действительно правильно вычисляет количество строк, которые должны отображаться (например, 25 из 100), но затем не разбивает на страницы, оставляя меня застрявшим на 1-й странице сте же 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";
            }
    }
}

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Нашел это. Проблема заключалась в том, что в запросе, который я использовал для подсчета переменной 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;

...

}
0 голосов
/ 01 ноября 2019

В вашем массиве ответов, не должны ли они называться «data» вместо «aaData»? я не могу найти, чтобы вы установили свойство «dataSrc» так, чтобы оно использовало «aaData» вместо «data».

Кроме этого проверьте свои recordsTotal и recordsFiltered значения, чтобы увидеть, все ли запросы действительно работают как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...