PHP / SQL - 结合AND&或在foreach()

时间:2017-10-23 16:26:59

标签: 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 = $tag['tag'];
    $query.=" AND city = '".$tag."'";
}

...复制这个:

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

但是如果我想提供复制,foreach()应该如何:

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

2 个答案:

答案 0 :(得分:1)

在查询和IN clause函数中使用implode形成它的更好方法是:

$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)."')";
}

答案 1 :(得分:0)

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

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.=")";