好吧,我对此感到茫然。我四处搜寻,阅读了手册(它的语法完全不同,只提供了PDO示例),并且在此上花了太多时间,因为我想使其在AJAX中工作,因为这样做是正确的
因此,我显然有一个包含大量记录的数据表,并且正在努力使分页正常工作,搜索和排序所有工作正常。
遵循手册,我可以通过使用LIMIT
SQL查询上的命令来收集处理分页的信息,然后该命令再次从$_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";
}
}
}
找到了。问题是我用来对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;
...
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句