Datatables - Seltsames Verhalten bei der serverseitigen Suche
Hallo zusammen,
-
Ich habe bisher Datatables ohne Probleme mit Javascript und einer Textbasierten Datenbank benutzt. Seitdem ich Datatables via PHP mit einer SQL Datenbank verbunden habe, tritt allerdings ein seltsamer Fehler auf. Bei allen Zeichen bis auf 0 ß % und _ wird normal gesucht. Nur bei den eben genannten Zeichen wird nicht gesucht bzw alles angezeigt.
-
MFG Ingo
Der HTML und JS-Teil
Der PHP-Teil
Die SQL-Testdatenbank
-
Ich habe bisher Datatables ohne Probleme mit Javascript und einer Textbasierten Datenbank benutzt. Seitdem ich Datatables via PHP mit einer SQL Datenbank verbunden habe, tritt allerdings ein seltsamer Fehler auf. Bei allen Zeichen bis auf 0 ß % und _ wird normal gesucht. Nur bei den eben genannten Zeichen wird nicht gesucht bzw alles angezeigt.
-
MFG Ingo
Der HTML und JS-Teil
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css">
<script type="text/javascript" language="javascript" src="https://code.jquery.com/jquery-3.3.1.js"></script>
<script type="text/javascript" language="javascript" src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>
<script type="text/javascript" language="javascript" >
$(document).ready(function() {
var dataTable = $('#mytable').DataTable( {
"bLengthChange": false,
"processing": true,
"serverSide": true,
"ajax":{
url :"Verarbeitung.php", // json datasource
type: "post", // method , by default get
error: function(){ // error handling
}
}
} );
$("#mytable_filter").css("display","none"); // hiding global search box
$('.search-input-text').on( 'keyup click', function () { // for text boxes
var i =$(this).attr('data-column'); // getting column index
var v =$(this).val(); // getting search input value
dataTable.columns(i).search(v).draw();
} );
} );
</script>
</head>
<body>
<table id="mytable" class="display">
<thead>
<tr>
<th>Anfangszeichen</th>
</tr>
</thead>
<thead>
<tr>
<td>
<select data-column="0" class="search-input-text">
<option>A</option>
<option>B</option>
<option>C</option>
<option>0</option>
<option>1</option>
<option>2</option>
<option>-</option>
<option>_</option>
</select>
</td>
</tr>
</thead>
</table>
</body>
</html>
Der PHP-Teil
<?php
/* Database connection start */
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test2";
$conn = mysqli_connect($servername, $username, $password, $dbname) or die("Connection failed: " . mysqli_connect_error());
/* Database connection end */
// storing request (ie, get/post) global array to a variable
$requestData= $_REQUEST;
$columns = array(
// datatable column index => database column name
0 =>' mydata1'
);
// getting total number records without any search
$sql = "SELECT mydata1 ";
$sql.=" FROM noname";
$query=mysqli_query($conn, $sql) or die("mytable-data.php: get nonames");
$totalData = mysqli_num_rows($query);
$totalFiltered = $totalData; // when there is no search parameter then total number rows = total number filtered rows.
$sql = "SELECT mydata1 ";
$sql.=" FROM noname WHERE 1 = 1";
// getting records as per search parameters
if( !empty($requestData['columns']['search']['value']) ){ //name
$sql.=" AND mydata1 LIKE '%".$requestData['columns']['search']['value']."%' ";
}
$query=mysqli_query($conn, $sql) or die("mytable-data.php: get nonames");
$totalFiltered = mysqli_num_rows($query); // when there is a search parameter then we have to modify total number filtered rows as per search result.
$sql.=" ORDER BY ". $columns[$requestData['order']['column']]." ".$requestData['order']['dir']." LIMIT ".$requestData['start']." ,".$requestData['length']." "; // adding length
$query=mysqli_query($conn, $sql) or die("mytable-data.php: get nonames");
$data = array();
while( $row=mysqli_fetch_array($query) ) { // preparing an array
$nestedData=array();
$nestedData = $row["mydata1"];
$data = $nestedData;
}
$json_data = array(
"draw" => intval( $requestData['draw'] ), // for every request/draw by clientside , they send a number as a parameter, when they recieve a response/data they first check the draw number, so we are sending same number in draw.
"recordsTotal" => intval( $totalData ), // total number of records
"recordsFiltered" => intval( $totalFiltered ), // total number of records after searching, if there is no searching then totalFiltered = totalData
"data" => $data // total data array
);
echo json_encode($json_data); // send data as json format
?>
Die SQL-Testdatenbank
--
-- Table structure for table `noname`
--
CREATE TABLE IF NOT EXISTS `noname` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'primary key',
`mydata1` varchar(255) NOT NULL COMMENT 'mydata1',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='datatable demo table' AUTO_INCREMENT=64 ;
--
-- Dumping data for table `noname`
--
INSERT INTO `noname` (`id`, `mydata1`) VALUES
(1, 'A'),
(2, 'B'),
(3, 'C'),
(4, '0'),
(5, '1'),
(6, '2'),
(7, '-'),
(8, '_');
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 440503
Url: https://administrator.de/contentid/440503
Ausgedruckt am: 22.11.2024 um 11:11 Uhr
3 Kommentare
Neuester Kommentar
Also von PHP hab ich keinen Schimmer aber du verwendest LIKE und das interpretiert _ zumindest bei MSSQL als beliebiges Zeichen, wenn es nicht escaped wird. Das mit 0 kann ich nicht ganz nachvollziehen aber es wäre sehr hilfreich zu wissen welches SQL Statement tatsächlich am Ende abgesetzt wird. Sind da vielleicht noch eckige Klammern im Spiel?