【问题标题】:Search and Pagination not working while using server-side使用服务器端时搜索和分页不起作用
【发布时间】:2020-12-01 06:17:07
【问题描述】:

我正在使用数据表服务器端。我正在使用 ajax 获取记录。我的问题是,搜索和分页不起作用。我正在获取搜索和分页以及所有数据。

请检查下图,我每页显示 10 条记录,但显示全部。

我在 StackOverflow 上查看了有关此主题的服务器问题。我几乎检查了每个问题,但仍然找不到解决方案。

我正在使用下面的代码

if($_REQUEST['action']=='adminList'){

$stmt = $pdo->prepare("SELECT count(*) FROM tbl_admin");
$stmt->execute();
$totalRecords = $stmt->fetchColumn();
$query="SELECT `admin_id`, `a_firstname`, `a_lastname`, `a_email`,  `date_of_created` FROM `tbl_admin` WHERE is_active = 1 order by date_of_created DESC";

try {
      $stmt = $pdo->prepare($query);
      $stmt->execute();
      $result = $stmt->fetchAll();
             
      $data['data'] = [];
      foreach ($result as $row) {

        $arr_result = array(
                    //"id" =>$i++,
                    "name" =>$row['a_firstname'].' '.$row['a_lastname'],
                    "email" => $row['a_email'],
                    "date_of_created" => $row['date_of_created'],
        );


        $data['data'][] = $arr_result;
                }

                
                }
                catch(PDOException $e) {
                    echo "Error: " . $e->getMessage();
                }

$json_data = array(  
"draw"=> intval( $_REQUEST['draw'] ),
"recordsTotal"    => intval($totalRecords),  
"recordsFiltered" => intval($totalRecords),
"data"            => $data['data']
);

// echo "<pre>";
 //print_r($json_data);
echo json_encode($json_data);
//exit();
}

Js

$(document).ready(function() {
  var dataTable = $('#adminList').DataTable({
    "processing": true,
    "serverSide": true,
    "paging": true,
    "searchable": true,
    "ajax": {
      url: "fetch.php",
      type: "post",
      data: {
        action: "adminList"
      }
    },
    language: {
      sLengthMenu: "Show _MENU_", // remove entries text
      searchPlaceholder: "Search",
      emptyTable: "No record found",
      search: ""
    },
    "pageLength": 10,
    "paging": true,
    "columns": [{
        "data": "name"
      },
      {
        "data": "email"
      },
      {
        "data": "date_of_created"
      }
    ]
  });
});

这是我的输出

Array
(
    [draw] => 1
    [recordsTotal] => 17
    [recordsFiltered] => 17
    [data] => Array
        (
    // getting my all records
)
)

谁能帮我看看我的代码有什么问题?

【问题讨论】:

  • legacy.datatables.net/examples/data_sources/server_side.html 上有一些(旧)示例代码。对于分页,请查看if ( isset( $_GET['iDisplayStart'] ) &amp;&amp; $_GET['iDisplayLength'] != '-1' ),因为您的代码始终获取所有数据(不是您的 SQL 中的 LIMIT)
  • @NigelRen,但是我必须在哪里添加该代码?我相信来自数据表插件。
  • @NigelRen,如果我在查询中使用 LIMIT,那么我将只获得有限的价值..对吗?我必须显示所有记录,并且每页必须显示 10 条记录
  • LIMIT 允许您说出要返回的记录集 - 看看Pagination using MySQL LIMIT, OFFSET
  • @NigelRen,我在查询中设置了 LIMIT 10。所以现在我只得到 10 条记录,但其他记录呢?我相信数据表可以处理所有此类限制。

标签: php jquery datatables pagination server-side


【解决方案1】:

问题

您已使用serverSide: true 启用服务器端处理模式,这需要您处理脚本在服务器端执行的搜索、排序和分页。但是,您的脚本会返回所有数据,这就是为什么您会看到所有结果而不仅仅是第一页。

解决方案

  1. 编写适当的服务器端处理代码或使用帮助程序库。

    例如,DataTables 分发包括 ssp.class.php 帮助程序 calss 和 sample script,以帮助在您使用 PHP 时生成响应。

    否则,您可以检查sent parameters 并根据startlength 请求参数对结果进行分页。

  2. 通过删除 serverSide: true 作为初始化选项来切换到客户端处理模式,并在服务器端响应中返回所有数据。请记住,如果您拥有大型数据集(>10,000 条记录),此解决方案并不理想。

【讨论】:

猜你喜欢
  • 2018-12-23
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 2018-09-20
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
相关资源
最近更新 更多