搜索数据库PHP/MYSQL问题

搜索数据库PHP/MYSQL问题,php,mysql,search,Php,Mysql,Search,现在我只是用一个简单的 WHERE name LIKE '%$ser%' 但我遇到了一个问题——假设搜索正在测试123,而“名称”正在测试,它不会返回任何结果。你知道怎么修吗?我做错了什么吗?这就是LIKE的工作原理-它返回完全包含搜索字符串的行,如果使用“%”可以选择包含其他内容 如果要查看字段是否包含在字符串中,可以通过以下方式执行: SELECT * FROM `Table` WHERE "Testing 123" LIKE CONCAT("%",`name`,"%") 如果要搜索

现在我只是用一个简单的

WHERE name LIKE '%$ser%'

但我遇到了一个问题——假设搜索正在测试123,而“名称”正在测试,它不会返回任何结果。你知道怎么修吗?我做错了什么吗?

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

如果要查看字段是否包含在字符串中,可以通过以下方式执行:

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

如果要搜索“Testing”或“123”,请使用

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

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

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

其中的名称类似于“%Testing 123%”

您应该构建按单词分隔的查询:


如果名称像“%$word[1]]%$word[2]%”

如Scott所述,您无法检查搜索是否包含列值,它会反过来工作。 所以,如果
$ser=“testing”
表中有一行
name=testing 123
,它将返回

对于您试图执行的操作,您需要将搜索查询标记为术语,并对每个术语执行OR搜索,或者更好地查看
mysql全文搜索
,以获得更好的方法

效率不高(如您的示例所示),但可以按照您的需要工作:

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

正如Mark和其他人提到的,如果可能的话,全文搜索方法可能会更好

但是,您可以在单词边界上拆分搜索字符串并使用OR逻辑,但首先检查整个字符串,然后提供选项以扩大搜索范围:

注:未显示输入消毒和准备

1。查询:

$sql_where = "WHERE name LIKE '%$ser%'";  
$sql_where = get_sql_where($ser);
2.如果返回的结果为零,请询问用户是否希望单独查询每个单词

3.如果用户请求“每个单词”搜索,请使用以下内容进行查询:

$sql_where = "WHERE name LIKE '%$ser%'";  
$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

我很确定这会产生相同的结果。唯一不同的是PHP中的字符串串联-没有回答这个问题。这不是相同的结果,因为单词之间的百分比。你能解释一下你想做什么,以及为什么你希望搜索“testing 123”会给“testing”这个名字带来正面匹配吗?什么时候你不想让它匹配?不要使用CONCAT的意思-就像在like的左边进行通配符一样,这将确保索引不能被使用。在阅读了拜尔斯先生的答案后,我想我误解了这个问题。我的查询将找到搜索词中完全包含的所有名称。如果您的目标是查找部分匹配搜索词某一部分或另一部分的名称,则不希望执行此操作。可能。。。但同样可能的是,你对这个问题的理解是正确的。我已经重读了这个问题,但我仍然不知道这是什么意思。我认为我们的任何一个答案都可能是正确的解释。“我希望贝尔金鱼能澄清一些事情。”马克·拜尔斯:看来他给你的分数是正确的。很好地解释问题并回答它。