在 mysql where in 子句中对数组使用 implode

Posted

技术标签:

【中文标题】在 mysql where in 子句中对数组使用 implode【英文标题】:using implode for array inside mysql where in clause 【发布时间】:2017-07-27 16:17:05 【问题描述】:

我试图在 mysql where in 子句中使用数组

$result= $myDB->query("SELECT sum(total) as total FROM ".$myDB->prefix("mydata")." WHERE categoryname IN ('".$categoryname."') AND year='$year' AND stat_id='$stat_id'");

类别名称的当前输出是

('Cat1,Cat2,Cat3')

想要的输出

('Cat1','Cat2','Cat3')

到目前为止我试过了,但它不起作用

$categoryname_new = implode(',',$categoryname);

$result= $myDB->query("SELECT sum(total) as total FROM ".$myDB->prefix("mydata")." WHERE categoryname IN ('".$categoryname_new."') AND year='$year' AND stat_id='$stat_id'");

【问题讨论】:

也许$categoryname_new = "'" . implode("','",$categoryname) . "'"; 占位符会更简单、更安全。 内爆函数返回一个字符串,为了在这个字符串中的每个单词周围加上引号,你需要在内爆之前操作你的数组,或者对生成的字符串应用一些正则表达式。 【参考方案1】:

天真的解决方案是:

$array = ['Cat1', 'Cat2', 'Cat3'];
echo "'" . implode("','", $array) . "'";

但它可能会引入sql注入,因此您需要先正确转义数组中的数据

带转义的单行示例:

echo "'" . implode("','", array_map('mysql_escape_string', $array)) . "'";

注意:mysql_* 功能已弃用,您需要使用需要连接链接的mysqli_*

【讨论】:

非常感谢【参考方案2】:

我不久前使用array_map 做了类似的事情,希望对您有所帮助:

$args = array_map(function($a) 
    return sprintf("'%s'", $a);
, $args);

$args = join(",", $args);

上面的代码将遍历数组并修改每个元素以用''包围它。最后,我用, 加入数组。

【讨论】:

以上是关于在 mysql where in 子句中对数组使用 implode的主要内容,如果未能解决你的问题,请参考以下文章

mysql设计与优化

sql面试题_SQl优化技巧_1注意通配符中like的使用,百分号放后面_2避免在where子句中对字段进行函数操作_3在子查询当中,尽量用exists代替in_4where子句中尽量不要使用(代码片

在 WHERE IN 子句中使用 JSONB 数组中的值

MySQL 不使用带有 WHERE IN 子句的索引?

mysql子查询在where in子句中

7_mysql查询之where子句