AJAX と PHP を使用して複数フィールドのライブ検索エンジンを作成する際に問題があります。
これまでは、複数のフィールドを検索する必要はなかったので、1 つのフィールドのみで問題なく機能する単純なクエリがありました。
関数を使用したライブ検索のため、onkeyup
いくつかの問題を認識しました。私が説明する必要がある最初の問題:
テーブルの構造は非常に単純です。zipcode | city
たとえば、誰かが入力し12345
ます。もちろん、これは郵便番号です。しかし、誰かが入力した場合12345 hometown
、最初のキーワードが郵便番号で、2 番目が都市になる場合はどうなるでしょうか。
キーワードは を使用して分割されるpreg_split('/[\s]+/', $search_term)
ため、検索される単一のキーワードを含む配列を受け取ります。上記の場合は、 と になりkey[0] => 12345
ますkey[1] => hometown
。
私が使用するクエリは次のようなものです。
$where = "";
$search_term = preg_split('/[\s]+/', $search_term); //splits the whole string into single keywords
$total_search_terms = count($search_term); //counts the array-keys from $search_term
foreach ($search_term as $key=>$single_term) {
$where .= "`zipcode` LIKE '$single_term%' OR `city` LIKE '$single_term%' ";
if ($key != ($total_search_terms - 1)){ //adds AND to the query in case in case of a non empty array-key
$where .= " AND ";
}
}
$query = $db->query("SELECT COUNT(*) FROM table WHERE $where");
...
さて、これまでのところとても良いです。問題は、キーワードが各フィールドに何度も一致する可能性があることです。
さらに例を挙げると:
上記の入力の場合、フィールドORに 一致できる12345 hometown
ことを意味します。この条件は、フィールドORに一致する場合でも、と同等です。ですから、逆に入っても同じ意味です。key[0] => 12345
zipcode
city
key[1] => hometown
zipcode
city
hometown 12345
そして、これが私が最初に抱えた問題です。
クエリを構成するロジックを探しています。したがって、入力する場合は、次の12345 hometown
ようなものが必要です。
key[0] => 12345
フィールドが一致する場合、それがORで一致するかどうかをzipcode
確認しないでください。一致する必要があるのは非常に論理的であるためです。key[1] => hometown
zipcode
city
key[0]
zipcode
key[1]
city
アップデート
さて、私の 2 番目の問題を説明するdavid strachan
ために、都市に複数の文字列が含まれている場合に問題が発生すると彼は言いました。検索文字列が次のようになるとします。
12345 New York
キーは次のとおりです。
key[0] => 12345, key[1] => New, key[2] => York
さて、問題は、キーの1つに整数が含まれているかどうかを確認でき、文字列の長さが正確に5の場合、それが郵便番号になることがわかっていることです。
key[0] => 12345 //if ( stringlen(key[0|) === 5) === true && is_int(key[0]) === true) {zipcode}
ここまでは順調ですが、本当の問題は、都市の文字列の背後にあるロジックです。最初に考えたのは、整数を含まないすべてのキーは都市でなければならないので、それらを 1 つのキーに変換できるということでした。
key[1] => New, key[2] => York //if ( !is_int(key[1|) === true && !is_int(key[2|) === true) {$create_one_key = array_fill_keys(key[1], key[1]+key[2]);}
わかりましたが、将来通りの名前を追加したい場合はどうすればよいですか? 通りの名前や都市名を分離してテストする方法がわかりません。