消除ajax搜索中的空白区域

时间:2012-11-29 16:31:36

标签: php javascript jquery ajax

我使用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 个答案:

答案 0 :(得分:2)

使用trim()功能:

  

从a的开头和结尾去掉空格(或其他字符)   字符串。

将其插入您的代码:

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

顺便问一下,你是否有理由在输入中使用htmlentities?

答案 1 :(得分: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>';
        }

答案 2 :(得分:1)

让我们从“旁注”开始:

您只是在查看选择查询中的firstname列。找到“firstname lastname”的一种方法可能是修改您的搜索:

$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);

这将构建一个查询,它将逐个搜索每个单词,而不是按特定顺序搜索。但是它有点慢。

答案 3 :(得分:0)

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

或者如果不同于jQuery

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

将在服务器端发送值之前结束/开始删除空格。