我使用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);
,但它没有像我希望的那样工作。任何提示可能会非常感激
答案 0 :(得分:2)
使用trim()功能:
从a的开头和结尾去掉空格(或其他字符) 字符串。
将其插入您的代码:
$search_term = mysql_real_escape_string(htmlentities(trim($_POST['search_term'])));
顺便问一下,你是否有理由在输入中使用htmlentities?
答案 1 :(得分:2)
$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());
});
将在服务器端发送值之前结束/开始删除空格。