搜索数据库PHP / MYSQL问题

时间:2010-06-24 19:58:41

标签: php mysql search

现在我只是使用一个简单的

WHERE name LIKE '%$ser%'

但是我遇到了一个问题 - 比如说搜索是测试123而“名称”是测试,它没有任何结果。知道任何修复方法吗?我做错了吗?

6 个答案:

答案 0 :(得分:5)

如果您要搜索“测试”或“123”,请使用OR

WHERE (name LIKE '%Testing%' OR name LIKE '%123%')

但请注意,这将非常慢,因为不能使用索引,它可能会返回一些您不想要的结果(如“4123”)。根据您的需要,使用full text search或外部数据库索引产品(如Lucene)可能是更好的选择。

答案 1 :(得分:3)

这就是LIKE的工作原理 - 它返回完全包含搜索字符串的行,如果使用“%”,则可选择包含其他内容。

如果您想查看该字段是否包含在字符串中,您可以这样做:

SELECT * FROM `Table` WHERE  "Testing 123" LIKE CONCAT("%",`name`,"%") 

答案 2 :(得分:1)

更换变量$ ser后,查询为:

WHERE name LIKE '%Testing 123%'

您应该按单词构建查询:

WHERE name LIKE '%$word[1]%$word[2]%'

答案 3 :(得分:1)

正如斯科特所提到的,你无法检查搜索是否包含列值,它是相反的。 因此,如果$ser = "testing"和表格有一行name = testing 123,则会返回

对于您要执行的操作,您需要将搜索查询标记为术语并对其中的每一个执行OR搜索,或者更好地检查mysql full text search以获得更好的方法

答案 4 :(得分:1)

效率不高(作为你的例子),但按你的意愿工作:

WHERE name LIKE '%$ser%' OR '$ser' LIKE CONCAT('%', name, '%')

答案 5 :(得分:0)

如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