ОК, я в растерянности с этим. Я обыскал все, прочитал руководство (которое имеет совершенно другой синтаксис и дает только примеры PDO) и вообще потратил слишком много времени на это только потому, что хочу заставить его работать в AJAX , потому что это правильночтобы сделать
Итак, у меня, очевидно, есть таблица данных с большим количеством записей, и я изо всех сил стараюсь, чтобы нумерация страниц работала, поиск и упорядочивание всех работ нормально.
Следуя инструкции, яМожно узнать, что разбиение на страницы выполняется с помощью команды LIMIT
в запросе SQL, которая затем снова получает количество строк из переменной $_REQUEST
, соответственно изменяя запрос, чтобы отобразить правильное число строк start, end
.
Моя проблема сейчас заключается в том, что datatables () действительно правильно вычисляет количество строк, которые должны отображаться (например, 25 из 100), но затем не разбивает на страницы, оставляя меня застрявшим на 1-й странице сте же 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";
}
}
}