1

keyup関数を使用してデータベース内のプロファイルを検索するajax検索ボックスを作成しました。

$('#asearch').keyup(function(){
    var search_term = $(this).val();

私が抱えている問題は、名を入力した後にスペースバーを押すと、検索ボックスに結果が表示されなくなることです。名を検索してスペースと名前を入力しても結果が得られるようにするために作成します。

if (isset($_POST['search_term'])){
    $search_term = mysql_real_escape_string(htmlentities($_POST['search_term']));


    if (!empty($search_term)){

        $search = mysql_query("SELECT `firstname`, `lastname` FROM `tempusers`
        WHERE `firstname` LIKE '%$search_term%'");
        $result_count = mysql_num_rows($search);

        while ($results_row = mysql_fetch_assoc($search)) {
            echo  '<li>', $results_row['firstname'],'  ', $results_row['lastname'], '</li></br>';
        }
    }

}

正規表現を使用してみました$search_term = preg_split('/[\s]+/', $search_term);が、期待どおりに機能しませんでした。どんなヒントも大歓迎です

4

4 に答える 4

2

trim()関数を使用します。

文字列の先頭と末尾から空白 (またはその他の文字) を取り除きます。

コードにプラグインする:

$search_term = mysql_real_escape_string(htmlentities(trim($_POST['search_term'])));

ところで、入力に htmlentities を使用している理由はありますか?

于 2012-11-29T16:32:36.207 に答える
2

Blam が前に言ったように、検索文字列を分割するために必要になることがあります。私はしばしばこの種のアプローチを使用しています:

$search_term = str_replace(' ','%', trim($search_term));
//"paul dyk" will be changed to "paul%dyk"
//% will match any charackers between those you need. So if you need filter out those names like "pauladyk juk" use $search_term = str_replace(' ',' % ', trim($search_term)); as then spaces must exist, but there can be any words between them.

$search = mysql_query("SELECT CONCAT_WS(' ',firstname, lastname) as full_name FROM tempusers WHERE CONCAT_WS(' ',firstname, lastname) LIKE '%".mysql_real_escape_string($search_term)."%'");
//I would use concat_ws to join strings so if one of them is NULL it will not matter. Using concate with NULL you get no result

while ($results_row = mysql_fetch_assoc($search)) {
            echo  '< li>' . $results_row['full_name'].  '</ li>< br>';
        }
于 2012-11-29T20:36:33.387 に答える
1

「サイドコメント」から始めましょう。

選択クエリの firstname 列を調べているだけです。「firstname lastname」を見つける 1 つの方法は、検索を変更することです。

$search = mysql_query("SELECT firstname, lastname FROM tempusers
    WHERE CONCAT(firstname, ' ', lastname) LIKE '%$search_term%'");

したがって、姓で何かを見つけたい場合は、そこも調べる必要があります。

次に、検索クエリに戻ります。

私が通常最初に行うことは、クエリを「トークン」に分割することです。たとえば、「姓名」や同様のクエリ (たとえば、「paul dyk」と入力しても「paul van dyk」を検索したい場合など) も検索できるようにするために、これを行います。

これを行う簡単な方法は、explode(' ', $search_term) を使用することです。これは、ユーザーが行動する限り機能します。別のオプションは、質問で言及した正規表現です。

次に、これらの「サブクエリ」を使用してデータベースを検索します。

Explode() は、単語の配列を提供します。

array(
   'paul',
   'van',
   'dyk'
)

そこから、SQL クエリを作成する必要があります。

// DON'T DO THE ESCAPE THING BEFORE THIS!
$words = explode(' ', $search_term)

$sql = 'SELECT `firstname`, `lastname` FROM `tempusers` WHERE 1 = 1';

for ($words as $word) {
   if (!empty($word)) {
     $word = mysql_real_escape_string($word);
     $sql .= " AND (firstname LIKE '%" . $word . "%' OR lastname LIKE '%" . $word . "%')";
   }
}

$search = mysql_query($sql);

これにより、特定の順序ではなく「1 つずつ」各単語を検索するクエリが作成されます。ただし、少し遅いです。

于 2012-11-29T16:45:36.580 に答える
0
$('#asearch').keyup(function(){
    var search_term = this.value.trim();
});

またはjQueryを主張する場合

$('#asearch').keyup(function(){
    var search_term = $.trim($(this).val());
});

値がサーバー側に送信される前に、末尾/先頭の空白を削除します。

于 2012-11-29T16:38:48.893 に答える