der-ingo
Goto Top

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

<!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, '_');  

Content-Key: 440503

Url: https://administrator.de/contentid/440503

Printed on: April 25, 2024 at 16:04 o'clock

Member: ukulele-7
ukulele-7 Apr 15, 2019 at 06:07:09 (UTC)
Goto Top
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?
Member: Der-Ingo
Der-Ingo Apr 15, 2019 at 07:39:19 (UTC)
Goto Top
Hi,
erst einmal Danke für den Hinweis bezüglich LIKE.
Aber was meinst du mit (tatsächlich am Ende abgesetzt) ?
MFG Ingo
Member: ukulele-7
ukulele-7 Apr 15, 2019 at 09:20:35 (UTC)
Goto Top
Naja dein Code baut ein Select-Statement zusammen a la
SELECT * FROM tabelle WHERE 1=1 AND spalte LIKE '%_%'  
und schickt dieses dann an die Datenbank. Du störst dich ja am gelieferten Ergebnis, das liefert die DB ja nicht aufgrund des PHP Codes sondern nur aufgrund des Select-Statements.