Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 基于关键字的mySql搜索查询_Php_Mysql - Fatal编程技术网

Php 基于关键字的mySql搜索查询

Php 基于关键字的mySql搜索查询,php,mysql,Php,Mysql,我找不到任何对我有帮助的东西。 我有一个具有以下结构的数据库: 以及一个简单的查询,用于搜索和显示数据库中的一些结果: if ($_REQUEST['search']) { $q = $_REQUEST['search']; $q_comma = explode(", ", $q); $where_in_set = ''; $count = count($q_comma); foreach ($q_comma as $q) { $cou

我找不到任何对我有帮助的东西。 我有一个具有以下结构的数据库:

以及一个简单的查询,用于搜索和显示数据库中的一些结果:

if ($_REQUEST['search']) {
    $q = $_REQUEST['search'];
    $q_comma = explode(", ", $q);
    $where_in_set = '';
    $count = count($q_comma);

    foreach ($q_comma as $q) {
        $counter++;
        if ($counter == $count) {
            $where_in_set .= "FIND_IN_SET('$q','keywords')";
        } else {
            $where_in_set .= "FIND_IN_SET('$q','keywords') AND ";
        }
    }


    $sql_res = "select link, description, keyword from myDB where $where_in_set or description like '%$q%'";
这段代码可以工作,但不是我想要的

在关键字列中,我有不同的逗号分隔关键字,我希望能够搜索它们,即使顺序不同

这里有一个例子:假设我已经进入我的关键字列

谷歌、Facebook、twitter

用我当前的代码,如果我输入Google,我可以看到结果,但是如果我输入twitter,我看不到结果

我能做些什么来让它工作,而不考虑关键字的顺序,但也有一个相当快的搜索

任何帮助都将不胜感激

另外,如果可能的话,我只想保留一个DB,因为我读到了关于创建一个只有ID和关键字的新表的内容,并且在我的搜索中加入ID上的表,但是如果可能的话,我更喜欢一个更好的解决方案

谢谢

编辑

一些更新:

  • 正如@Frayne Konok所指出的,我在lowcase中有查询,在lowcase中也有db中的所有值,所以case不是问题所在
  • 根据@mkaatman的建议,我将
    关键字
    列包装在backticks(`)周围
  • 我更改了我的查询,因此现在它看起来像答案中@user2272989建议的查询
  • 因此,我的查询现在如下所示:

    select link, description, keyword from myDB
    where (FIND_IN_SET('google',`keyword`) or
           FIND_IN_SET('facebook', `keyword`) or 
           FIND_IN_SET('twitter', `keyword`))
           OR description like 'google, facebook, twitter'
    
    即使顺序不同,它也会返回值,但它不会只显示我想要的值。 例如,如果我写twitter、google、facebook,我会返回28行,其中只有2行将这三个词都作为关键字,而我的另一行只有一个或两个

    编辑2-更新

    我只是想“重新打开”这个问题,因为我没能解决这个问题。如果我将所有关键字都更改为一个对象,那么将它们用作关键字会更好吗?或者,在数据库中搜索关键字的绝对最佳和更可靠的方法是什么?使用不同的DBs并使用内部联接

    在这一点上,如果有帮助的话,我愿意改变结构和代码

    谢谢这可能对你有帮助

    $sql_res = "select link, description, keyword from myDB 
          where (FIND_IN_SET('yahoo',keyword) or
                 FIND_IN_SET('twitter',keyword)) or 
                 description like '%$q%'";
    

    您在
    集合中查找中使用了
    条件

    $q = $_REQUEST['search'];
    $q_comma = array_filter(explode(' ', str_replace(',', ' ', $q)));
    $count = count($q_comma);
    $dbQuery = "select id, link, description, tags from db where ";
    $searchTerms = '';
    
    foreach ($q_comma as $q) {
        $counter++;
        if ($counter == 1) {
            $searchTerms .= "tags LIKE '%$q%'";
        } else {
            $searchTerms .= "and tags LIKE '%$q%'";
        }
    }
    
    
    $sql_res = $dbQuery . $searchTerms;
    $result = mysqli_query($db, $sql_res) or die(mysqli_error($db));
    $return_arr = array();
    $data = array();
    if (mysqli_num_rows($result) == 0) {
        echo "Nothing";
    } else {
        while ($row = mysqli_fetch_object($result)) {
            $data[] = $row;
        }
        mysqli_free_result($result);
        echo json_encode($data);
    }
    

    这行吗<代码>选择查找集合中的搜索(“推特”、“谷歌、Facebook、推特”)我将
    变量转储($q)就在foreach中,以确保您正在检查您认为正在检查的内容。此外,我认为关键字不应该用引号括起来。如果有问题,您可以尝试在
    说明中使用
    较低的
    。例如:
    LOWER(description)如“%$q%”
    。另外,
    strtolower
    在引号中没有关键字的
    $q
    @mkaatman我有一个语法错误,说“表中的未知列关键字”@FrayneKonok我已经在降低查询和我的数据库,但感谢您指出这一点out@Nick您需要使用反勾号而不是引号`用你的例子并不能像我需要的那样进行过滤……如果我输入google、facebook,它会显示所有正确的行,但是如果我添加twitter等,它仍然会显示所有的行,即使我只有1个,3个关键字都在一起