使用服务器端时搜索和分页不起作用

Search and Pagination not working while using server-side

提问人:user9437856 提问时间:8/11/2020 最后编辑:user9437856 更新时间:8/15/2020 访问量:1997

问:

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

请查看下图,我每页显示 10 条记录,但它显示所有记录。

enter image description here

我在 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
)
)

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

php jquery datatables 分页服务器

评论

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

答:

0赞 Gyrocode.com 8/15/2020 #1

问题

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

溶液

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

    例如,DataTables 分发包括ssp.class.php帮助程序 calss 和示例脚本,以帮助生成响应(如果您使用的是 PHP)。

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

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

评论

0赞 user9437856 8/15/2020
感谢您的回答,让我实现这个
0赞 user9437856 8/15/2020
关于ssp.class.php。一个月前,我问过这个问题,但我没有解决方案 stackoverflow.com/questions/62708059/......
0赞 user9437856 8/15/2020
我尝试了lengthMenu:[[3,25,50,100,-1],[3,25,50,100,“All”]], “pageLength”:3,但仍然显示我的所有记录。
0赞 user9437856 8/17/2020
我删除了所有代码并引用了此链接 datatables.net/examples/server_side/simple.html。现在我得到了输出。但是我这个问题 stackoverflow.com/questions/63426594/......