2017-12-11 4 views
0

このクエリでは苦労しています。私はajax呼び出しの部分文字列に対して2つのフィールドの1つを照合しようとしています。名前の入力を開始すると、姓または名と一致する必要があります。部分的な文字列にLIKEとCONCATを使用してmysqlクエリでパラメータ化されたPHP

パラメータ化されたクエリがLIKE文で0行を返しています。

私はhereherehereから回答を試みました。

私は何か単純なものが欠けているのですが、パラメータが部分文字列のために正しく渡されていないと考えることができます。

ここでは、db内のデータをアップロードするコードを示します。私は隠されたキャラクターが潜んでいるかもしれないと心配しましたが、私はそれらをすべて取り除いたと思います。

$fStu = new SplFileObject('../resources/students.txt'); 
$fStu->seek($count); 
list($year,$building,$id,$last,$middle,$first,$gender,$grade,$gradYear) = explode(",",$fStu->current());  
    if (!empty($year)){ 
     $stuQuery = "INSERT INTO students (LastName, MiddleName, FirstName, StudentId, Gender, Grade, GradYear) VALUES (?,?,?,?,?,?,?)"; 
     $stuStmt = $connect->prepare($stuQuery); 

     $last = preg_replace("/[^a-zA-Z0-9']/", "", $last); 
     $first = preg_replace("/[^a-zA-Z0-9']/", "", $first); 
     $middle = preg_replace("/[^a-zA-Z0-9']/", "", $middle); 
     $gender = preg_replace("/\r|\n|\s+/", "", $gender); 
     $id = intval(preg_replace('/\D/', '', $id)); 
     $gradYear = intval(preg_replace('/\D/','', $gradYear)); 
     $grade = intval(preg_replace('/\D/','', $grade)); 
     $stuStmt->bind_param("sssisss", $last, $middle, $first,$id,$gender,$grade,$gradYear); 
     $stuStmt->execute(); 
     echo $count . "||" . $last . ", " . $first . " (" . $id . ")"; 
    } 
    else { 
     $count = -1; 
     echo $count . "||Complete."; 
    } 

ここでは、クエリ文字列の部分名を渡すメインページです。

$(document).ready(function(){ 
      $("#name").on("change paste keyup", function(e){ 
       e.preventDefault(); 
       $.ajax({url: "process/students.php?name=" + $("#name").val(), 
        success: function(result){ 
         $("#results").removeClass("hidden"); 
         $("#results").html(result); 
        } 
       }); 
      }); 

アップロードされるデータのセットです。

> > Current School Year,Current Building,Student Id,Student Last Name,Student Middle Name,Student First Name,Student Gender,Student 
> > Grade,Grad Year 2018,111,11111111111,Doe,Jane,,F,09,2021 
> > 2018,111,22222222222,Doe,John,,M,09,2021 
+3

なぜ 'concat() 'を使うのですか?クエリを介して送信する前に、変数にシンボルを添付するだけではどうですか? – GrumpyCrouton

+0

私もそれを試しました(https://stackoverflow.com/questions/9138807/proper-pdo-syntax-for-parameterized-query-using-like-with-wildcards-ex)。結果は同じだと思います。ワイルドカードを追加する場所はどこですか?まだ同じ問題です。 – edumacator

+0

データベースに含まれているデータを使って実際の検索用語の例を表示できますか? – GrumpyCrouton

答えて

0

これはPDOとしてタグ付けされています。 mysqliではなくPDOを実際に使用している場合、1つの文で複数のパラメータをバインドすることはできません。個別に宣言し、使用している場合は?プレースホルダとして番号を付ける必要があります。

LIKEを使用している場合は、バインドする変数の両側に%記号を追加する必要があります。これは、試行しているときに%記号をクエリに含めることはできません。

ユーザーの入力を名字と姓に分割するのではなく、データベースから名前フィールドを連結し、その結果に対して検索するのはなぜですか?

SELECT * FROM students WHERE CONCAT_WS(' ', FirstName, LastName) LIKE '%whatever%';

関連する問題