代码之家  ›  专栏  ›  技术社区  ›  Tiago Fernandes

如何检查mysql字段中是否有特定的“标记”?

  •  0
  • Tiago Fernandes  · 技术社区  · 6 年前

    对于问题和下面的内容,我有一个小代码,用于检查表字段中是否存在特定的“标记”,我尝试执行以下操作:

    <?php
    $value = "e-sports";
    
    $test = array();
    $take = mysqli_query($conexao,"SELECT * FROM news WHERE game LIKE '%$value%' OR tags LIKE '%$value%' ");
    
    while ($info = mysqli_fetch_array($take)) {
    
        $test[] = $info['tags']; 
    
        if (in_array($value, $test)) {
            echo "ok";
        }else{ 
            echo "not";
        }
    }
    ?>
    

    但这并没有奏效。 我想知道它是否有更好的形状,或者可以用什么来代替。

    3 回复  |  直到 6 年前
        1
  •  0
  •   lufc    6 年前

    看起来像 tags 数据库的列是一种包含多个标记的列表,例如。 'tag1,tag2,tag3' ,因此,通过进行简单的字符串比较,您的解决方案和Rod Elias的解决方案将不起作用。

    相反,应该将字符串分解为一个数组,然后进行搜索。设置的值 $tagseparator 在db中划分标签的内容。

    <?php
    $value = "e-sports";
    $tagseparator = ",";
    
    $test = array();
    $take = mysqli_query($conexao,"SELECT * FROM news WHERE game LIKE '%$value%' OR tags LIKE '%$value%' ");
    
    while ($info = mysqli_fetch_array($take)) {
        foreach(explode($tagseparator,$info['tags']) as $tag) {
            $test[] = $tag;
        }
    }
    
    if (in_array($value, $test)) {
        echo "ok";
    } else { 
        echo "not";
    }
    ?>
    

    请注意,如果要逐行检查,而不是在整个结果集中检查,只需将测试更改为

    while ($info = mysqli_fetch_array($take)) {
        $test = explode($tagseparator,$info['tags']);
        if (in_array($value, $test)) {
            echo "ok";
        } else { 
            echo "not";
        }
    }
    
        2
  •  0
  •   Rod Elias    6 年前

    你为什么不干脆做:

    if ($info['tags'] == $value) {
        echo 'ok';
    } else {
        echo 'not';
    }
    

    ?

        3
  •  -1
  •   Ryuk Lee    6 年前

    我有一个不使用while循环的解决方案

    $value = "e-sports";    
    $test = array();
    $take = mysqli_query($conexao,"SELECT * FROM news WHERE game LIKE '%$value%' OR tags LIKE '%$value%' ");
    //$take = [['id'=> 1, "tags" => "e-sports", "game" => "lol"],
             //['id'=> 2, "tags" => "mobile", "game" => "lol"],
             //['id'=> 3, "tags" => "xbox", "game" => "abc"]];
    $filter = array_filter( $take , function($v, $k) use ($value){
        return $v["tags"] == $value;
    } , ARRAY_FILTER_USE_BOTH);
    if(sizeof($filter) > 0){
        echo 'yes';
    }else{
        echo 'not';
    }