【发布时间】: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