【问题标题】:using implode for array inside mysql where in clause在 mysql where in 子句中对数组使用 implode
【发布时间】: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) . "'"; 占位符会更简单、更安全。
  • 内爆函数返回一个字符串,为了在这个字符串中的每个单词周围加上引号,你需要在内爆之前操作你的数组,或者对生成的字符串应用一些正则表达式。

标签: php mysql


【解决方案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);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 2020-04-18
    • 2020-10-13
    • 2021-09-25
    • 2010-12-07
    相关资源
    最近更新 更多