PHP/SQL-结合与&;或者在foreach()中

PHP/SQL-结合与&;或者在foreach()中,php,sql,foreach,Php,Sql,Foreach,我将json发送到服务器,如下所示: {"data":{"tags":[{"tag":"Paris"},{"tag":"New York"},{"tag":"London"}]},"terms":{"term":"index"}} 。。。使用foreach()我将提供的标记附加到查询中: $query = "SELECT name FROM accounts WHERE name = '".$term."'"; foreach($tags as $t=>$tag){ $tag

我将json发送到服务器,如下所示:

{"data":{"tags":[{"tag":"Paris"},{"tag":"New York"},{"tag":"London"}]},"terms":{"term":"index"}}
。。。使用foreach()我将提供的标记附加到查询中:

$query = "SELECT name FROM accounts 
WHERE name = '".$term."'";
foreach($tags as $t=>$tag){
    $tag = $tag['tag'];
    $query.=" AND city = '".$tag."'";
}
。。。要复制这一点:

SELECT name FROM accounts 
 WHERE name=$term 
 AND city=$tag
 AND city=$tag 
 AND city=$tag;
SELECT name FROM accounts 
 WHERE name=$term 
 AND (city=$tag OR city=$tag OR city=$tag);
但是,如果我想提供以下内容,foreach()应该是什么样子:

SELECT name FROM accounts 
 WHERE name=$term 
 AND city=$tag
 AND city=$tag 
 AND city=$tag;
SELECT name FROM accounts 
 WHERE name=$term 
 AND (city=$tag OR city=$tag OR city=$tag);

问题在于,在sql查询中,列名不能同时包含两个标记。比如说

WHERE name = true AND name = false
没有任何意义

所以你应该用这样的东西

WHERE name in ($tag, $term, $tag2);
因此,你也应该修改你的php代码

$first = true;
$query = "SELECT name FROM accounts 
WHERE name2 = '$term' and name in ("
foreach($tags as $t=>$tag){
    $tag = $tag['tag'];
    if($first == false) {
        $query.=",";
    }
    $query.="'".$tag."'";
    $first = false;
}
$query.=")";
在查询和函数中使用更好的方法来形成它:

$tags_list = array();
foreach($tags as $t=>$tag){
    $tags_list[] = $tag['tag'];
}

$query = "SELECT name FROM accounts 
WHERE name = '".$term."'";
if ($tags_list) {
    $query .= " AND city IN ('".implode("', '", $tags_list)."')";
}

在中使用
,我会移除foreach,并用array_列替换它,然后内爆。我想帮助他解决问题,因此使用他的编码风格。doe使用内爆绝对有意义实际上有两列。。。我在上面编辑了它。对不起。我应该继续使用in()?name=$term和name in是否有争议?@inxoy我认为问题的作者只是在字段名中弄错了,这不是给我减号的理由。我已经解释了基本原则。$tags_list=$tag['tag'];它不会像你期望的那样工作。它将只生成最后一个标记。@PPM您的查询在形成后是什么样子的?进行
echo$查询并将输出复制到这里。好的,现在开始工作。我发现了我的错误。。。我对数组进行了转义:$tags_list=$mysqli->real_escape_string(array());谢谢你在这方面的帮助。希望我在这个问题上不会得到太多的反对票;-)