现在我只是使用一个简单的
WHERE name LIKE '%$ser%'
但我遇到了一个问题 - 假设搜索的关键词是Testing 123,而“名称”是Testing,它没有返回任何结果。有什么方法可以解决吗?我做错了什么吗?
OR
:WHERE (name LIKE '%Testing%' OR name LIKE '%123%')
SELECT * FROM `Table` WHERE "Testing 123" LIKE CONCAT("%",`name`,"%")
虽然不是很高效(就像你的例子一样),但可以按照你想要的方式工作:
WHERE name LIKE '%$ser%' OR '$ser' LIKE CONCAT('%', name, '%')
在变量$ser被替换后,查询语句如下:
WHERE name LIKE '%Testing 123%'
您应该按单词分隔构建查询语句:
WHERE name LIKE '%$word[1]%$word[2]%'
$ser =“testing”
且表中有一行name = testing 123
,它将返回mysql全文搜索
以获得更好的方法。正如Mark和其他人所提到的,如果可能的话,完整文本搜索方法可能更好。
但是,您可以在单词边界上拆分搜索字符串并使用OR逻辑 - 但首先检查整个字符串,然后提供扩大搜索选项:
注意:未显示输入净化和准备。
1。使用以下查询:
$sql_where = "WHERE name LIKE '%$ser%'";
2. 如果没有返回结果,询问用户是否想逐个单词查询。
3. 如果用户请求进行“逐个单词”搜索,请使用以下查询:
$sql_where = get_sql_where($ser);
以下是(工作中的)示例代码:
$ser = 'Testing 123';
$msg = '';
function get_sql_where($ser){
global $msg;
$sql_where = '';
$sql_where_or = '';
$ser = preg_replace("/[[:blank:]]+/"," ", trim($ser)); //replace consecutive spaces with single space
$search_words = explode(" ", $ser);
if($search_words[0] == ''){
$msg = 'Search quested was blank.';
}else{
$msg = 'Search results for any of the following words:' . implode(', ', $search_words);
$sql_where = "WHERE name LIKE '%$ser%'";
foreach($search_words as $word){
$sql_where_or .= " OR name LIKE '%$word%'";
}
}
return $sql_where . $sql_where_or;
}
$sql_where = get_sql_where($ser);
//Run query using $sql_where string