【问题标题】:how do I check if there is a particular 'tag' in a mysql field?如何检查 mysql 字段中是否有特定的“标签”?
【发布时间】:2018-05-10 01:00:34
【问题描述】:

问题和以下,我有一个小代码来检查表字段中是否存在特定的“标签”,我尝试执行如下操作:

<?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";
    }
}
?>

但这并没有成功。 我想知道它是否有更好的形状,或者可以使用其他东西。

【问题讨论】:

  • 在什么方面没有成功?
  • 不要给我结果
  • 如果没有回显“ok”或“not”,则表示您的查询没有返回任何结果。
  • checks if a particular 'tag' exists in a table 为什么不比较tags 而没有game
  • 我有一个不使用while循环的解决方案

标签: php mysql html mysqli


【解决方案1】:

看起来您数据库的tags 列是某种包含多个标签的列表,例如'tag1,tag2,tag3',所以你的解决方案和 Rod Elias 的解决方案通过简单的字符串比较是行不通的。

相反,您应该将字符串分解为一个数组,然后对其进行搜索。将$tagseparator 的值设置为划分数据库中标签的任何值。

<?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】:

你为什么不干脆做:

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

?

【讨论】:

    【解决方案3】:

    我有一个不使用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';
    }
    

    【讨论】:

    • 我去这里测试一下,非常感谢大家的帮助
    • 这需要用户在调用过滤函数之前通过fetch_all()将整个表加载到内存中,你没有说清楚。此外,array_filter() 函数实际上是一个 for 循环,因此您不会节省计算量,同时会产生大量额外的内存成本。
    • 不使用fetch_all()查询还是$take = mysqli_query($conexao,"SELECT * FROM news WHERE game LIKE '%$value%' OR tags LIKE '%$value%' ");$take数组下面只是一个例子
    • 您通过 mysqli_query 使用大量连接到数据库,并在 while 循环中使用大量 mysqli_fetch_array
    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    相关资源
    最近更新 更多