2016-04-26 7 views
1

私はこのチュートリアル以下午前:私は検索入力にouを検索する場合
http://coderexample.com/demo/datatable-demo-server-side-in-phpmysql-and-ajax/のDataTable +サーバーサイド処理+検索フィルタリング

は私がNo matching records foundが、何を得る:ここ
http://coderexample.com/datatable-demo-server-side-in-phpmysql-and-ajax/

とはデモです私はこの行が返されたかったらAiri Satou少なくともです。

this私が変更しなければならないコードは、検索サーバー側で行う必要があると思います。

<?php 
/* Database connection start */ 
$servername = "localhost"; 
$username = "root"; 
$password = "Password1"; 
$dbname = "test"; 

$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 =>'employee_name', 
    1 => 'employee_salary', 
    2=> 'employee_age' 
); 

// getting total number records without any search 
$sql = "SELECT employee_name, employee_salary, employee_age "; 
$sql.=" FROM employee"; 
$query=mysqli_query($conn, $sql) or die("employee-grid-data.php: get employees"); 
$totalData = mysqli_num_rows($query); 
$totalFiltered = $totalData; // when there is no search parameter then total number rows = total number filtered rows. 


if(!empty($requestData['search']['value'])) { 
    // if there is a search parameter 
    $sql = "SELECT employee_name, employee_salary, employee_age "; 
    $sql.=" FROM employee"; 
    $sql.=" WHERE employee_name LIKE '".$requestData['search']['value']."%' "; // $requestData['search']['value'] contains search parameter 
    $sql.=" OR employee_salary LIKE '".$requestData['search']['value']."%' "; 
    $sql.=" OR employee_age LIKE '".$requestData['search']['value']."%' "; 
    $query=mysqli_query($conn, $sql) or die("employee-grid-data.php: get employees"); 
    $totalFiltered = mysqli_num_rows($query); // when there is a search parameter then we have to modify total number filtered rows as per search result without limit in the query 

    $sql.=" ORDER BY ". $columns[$requestData['order'][0]['column']]." ".$requestData['order'][0]['dir']." LIMIT ".$requestData['start']." ,".$requestData['length']." "; // $requestData['order'][0]['column'] contains colmun index, $requestData['order'][0]['dir'] contains order such as asc/desc , $requestData['start'] contains start row number ,$requestData['length'] contains limit length. 
    $query=mysqli_query($conn, $sql) or die("employee-grid-data.php: get employees"); // again run query with limit 

} else {  

    $sql = "SELECT employee_name, employee_salary, employee_age "; 
    $sql.=" FROM employee"; 
    $sql.=" ORDER BY ". $columns[$requestData['order'][0]['column']]." ".$requestData['order'][0]['dir']." LIMIT ".$requestData['start']." ,".$requestData['length']." "; 
    $query=mysqli_query($conn, $sql) or die("employee-grid-data.php: get employees"); 

} 

$data = array(); 
while($row=mysqli_fetch_array($query)) { // preparing an array 
    $nestedData=array(); 

    $nestedData[] = $row["employee_name"]; 
    $nestedData[] = $row["employee_salary"]; 
    $nestedData[] = $row["employee_age"]; 

    $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 

?> 

私はこのコードを変更する必要がありますか?
もしそうなら、私は何をしなければならないのかアドバイスできますか?
私はこれは聞くことが多いですが、ガイダンスに感謝します!あなたはあなたにも物乞いでワイルドカードを追加する必要が名前の真ん中に検索語に一致するようにしたいと

答えて

2
$sql.=" WHERE employee_name LIKE '".$requestData['search']['value']."%' "; 

は、(原因ワイルドカード%に)何も

を検索語に一致します。 :またはあなたのための問題であってもなくてもよく、これはemployee_nameのインデックスの使用を無効にします

$sql.=" WHERE employee_name LIKE '%".$requestData['search']['value']."%' "; 

注意。

これはすべての検索に最も適した方法ではありません。3つのフィールドをすべて確認する必要はありませんが、使用する検索者に尋ねてください。すべての年齢と給料の後にいくつかの一致する数字がある可能性があります。

27の検索は、年齢27または27000給与などに一致する可能性があり、誰もが検索

+0

この例ではインデックスは重要ですが、ポイントは良いとは思わないでください。 私は列ごとの検索に取り組んでいますが、難しさがあります。質問私は[ここ](http://stackoverflow.com/questions/36706424/datatables-connecting-to-a-db-getting-data-but-some-features-not-working)に尋ねた。多分あなたは右の支配に私を向けるだろうか? そして、私は各列に同じようにする必要があります。この給与「162700」が表示されるように「27」を検索します。 – HattrickNZ

+0

@HattrickNZこの質問に今答えるかどうかのコメントから分かりません –

1

あなたのクエリを更新する必要があることをやることがその無意味年齢のボブを持っていません。

次のSQL文は、「検索フィールド値」で始まるEMPLOYEE_NAMEとすべてを選択:

$sql.=" WHERE employee_name LIKE '".$requestData['search']['value']."%' "; 

それは特定のパターンかどうかをチェックするように、あなたのクエリは、所望の出力を得るために、以下のようなものでなければなりませんemployee_nameに存在します。

$sql.=" WHERE employee_name LIKE '%".$requestData['search']['value']."%' "; 
+0

上記のダーグと同じです。 – HattrickNZ

1

Where句を作成する方法は、検索するフィールドが検索タームから始まる必要があります。 where句を変更する

$sql.=" WHERE employee_name LIKE '%".$requestData['search']['value']."%' "; 

また、実行していることによってSQLインジェクションが可能です。この脆弱性を削除するには、パラメータ化されたクエリを使用する必要があります。情報については、How can I prevent SQL injection in PHP?を参照してください。

+0

上記ダゴンと同じです。 SQLインジェクションリンクのためのtks – HattrickNZ

関連する問題