在 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的主要内容,如果未能解决你的问题,请参考以下文章
sql面试题_SQl优化技巧_1注意通配符中like的使用,百分号放后面_2避免在where子句中对字段进行函数操作_3在子查询当中,尽量用exists代替in_4where子句中尽量不要使用(代码片