1

我创建了一个 ajax 搜索框,使用 keyup 函数在我的数据库中查找配置文件。

$('#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 lastname”的一种方法可能是修改您的搜索:

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

因此,如果您想在姓氏中找到任何内容,您也需要查看那里。

然后回到搜索查询:

我通常首先做的是将查询拆分为“令牌”。我这样做是为了确保我也可以找到 - 例如“lastname firstname”和类似的查询(例如,人们可能输入“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);

这将建立一个查询,它将“一个接一个”而不是按特定顺序搜索每个单词。不过,它有点慢。

于 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 回答