2015-06-30 2 views
1

enter image description here У меня есть данные с процессом обработки серверных файлов. Данные взяты из ожидаемой таблицы, но она не является страницей по datatable. Я вижу, что в отладочной сумме 14 записей базы данных aaData, которая будет отображаться, равна 5, , поэтому я ожидаю, что будет 3 страницы .., но только 1 страница diplayed и 5 строк на странице.jquery datatable not pagiging за исключением первой страницы

вот мой табл HTML:

<table style="text-align: center" class="table table-striped table-bordered table-hover" id="usersTable"> 
        <thead> 
        <tr> 
         <th> 
          User Name 
         </th> 
         <th> 
          Account 
         </th> 
         <th> 
          Enable 
         </th> 
         <th> 
          Remark 
         </th> 
        </tr> 
        </thead> 
        <tbody> 
        </tbody> 
       </table> 

и DataTable Защита:

var tableObject = $("#usersTable").dataTable({ 
     "bProcessing": true, 
     "bServerSide": true, 
     "sAjaxSource": "../../Controller/UserManagementControllercopy.php5", 
     "aoColumns": [ 
     { "mDataProp": "0", "sWidth": "40%", "bSearchable": false }, 
     { "mDataProp": "1", "sWidth": "20%"}, 
     { "mDataProp": "3", "sWidth": "20%" }, 
     { "mDataProp": "2", "sWidth":"20%" } 
     ], 
     "fnServerData": function (sSource, aoData, fnCallback){ 
     $.ajax({ 
     "dataType": "json", 
     "contentType": "application/json; charset=utf-8", 
     "type": "GET", 
     "url": sSource, 
     "data": aoData, 
     "success": function(result){ 
      fnCallback(result); 
     }, 
      error: function (xhr, textStatus, error){ 
       debugger 
       if (typeof console == "object") { 
        console.log(xhr.status + "," + xhr.responseText + "," + textStatus + "," + error); 
       } 
      }}); 
     }, 

     "oLanguage": { 
     "sLengthMenu": '<select>' + 
     '<option value="5">5</option>' + 
     '<option value="10">10</option>' + 
     '<option value="20">20</option>' + 
     '<option value="30">30</option>' + 
     '<option value="40">40</option>' + 
     '<option value="50">50</option>' + 
     '</select> Show' 
     }, 
     "fnDrawCallback": function(){ 
     }, 

     "aaSorting": [ 
      [1, 'asc'] 
     ], 
     "aLengthMenu": [ 
      [5, 15, 20, -1], 
      [5, 15, 20, "All"]    ], 

     "iDisplayLength": 5 
    }); 

и ServerCode:

$aColumns = array('USERNAME', 'ACCOUNT', 'REMARK', 'ENABLE'); 
      $sQuery = " SELECT USERNAME,ACCOUNT,REMARK,ENABLE FROM users LIMIT ".$_GET['iDisplayStart'].", ".$_GET['iDisplayLength'].";"; 
      $dbObject = Connection::getConnection(); 
      $request = $dbObject->dbh->prepare($sQuery); 
      if ($request->execute()) 
      { 
       $resultData["Data"] = $request->fetchAll(PDO::FETCH_ASSOC); 
       $sQuery = "SELECT COUNT(USERNAME) FROM users"; 
       $request = $dbObject->dbh->prepare($sQuery); 
       $request->execute(); 
       $iTotal = $request->fetchColumn(0); 
       $output = array(
        "sEcho" => intval($_GET['sEcho']), 
        "iTotalRecords" => intval($iTotal), 
        "iTotalDisplayRecords" => intval($_GET['iDisplayLength']), 
        "aaData" => array() 
       ); 
       for ($j=0 ; $j<count($resultData["Data"]) ; $j++) 
       { 
        $aRow = $resultData["Data"][$j]; 
        $row = array(); 
       $output["Success"]=true; 
       echo json_encode($output); 
      } 

и здесь, как возвращаемые данные из запроса GET из DataTable, кажется, является : (хром панель для разработчиков)

enter image description here

ответ

1

Вы возвращаете неправильное значение для iTotalDisplayRecords в массиве json. Он должен быть Всего записей, после фильтрации (т.е. общее количество записей после фильтрации была применена - не только количество записей, возвращаемых в этом наборе результатов) см documentation и передать этот https://datatables.net/forums/discussion/512/clarification-of-itotalrecords-and-itotaldisplayrecords

+0

@Vishan Привет , Я изменил код на серверном сервере так: ... «iTotalRecords» => intval ($ iTotal), «iTotalDisplayRecords» => intval ($ iTotal), ... И я вижу, что сейчас он отлично работает. Но я не могу понять, почему это работает сейчас :)) почему itotalrecords и itotaldisplayrecords должны быть одинаковыми? Или снова что-то мне не хватает –

+1

@Mehmet Вам больше не хватает точки. Для вашего текущего кода он будет работать, поскольку вы не используете какой-либо фильтр. Но, если вы будете использовать какое-то условие фильтрации WHERE или Datatable Searchbox, вы снова не получите ожидаемый результат. См., Itotalrecords - это количество общих записей, которые у вас есть в базе данных для соответствующих таблиц, а itotaldisplayrecords - количество записей, которые вы получаете после фильтрации (например, если вы будете использовать поле поиска). – Vishal

+0

Да, я понимаю. И теперь я удивляюсь этому; трижды запуская запросы (выберите count (*) из таблицы и выберите count (*) из таблицы, где ...) для itotalrecorads и itotaldispalyrecords. и (выберите column1, column2 .. из таблицы) для данных содержимого таблицы. Выполняя это, каждый запрос получает каждый раз переместить страницу в таблицу. Таким образом, это, по-видимому, вызывает проблемы с производительностью .. что является эффективным способом достижения этого. –

Смежные вопросы