微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

格式化SQL“IN”子句的PHP数组

我正在尝试在数据库查询“product_id”包含在产品ID数组中的记录.

该数组是多选输入(< select>)的结果,如下所示:

$clients = 
  Array ( 
    [0] => 80000016-1302638679
    [1] => 8000003B-1329924004
  )

我想将该数组传递给sql语句的“IN”子句,例如:

$sql = "SELECT * FROM sales WHERE product_id IN (".$clients.")";

…但这不起作用(错误:消息:数组到字符串转换).

一些帖子建议使用此函数以适合sql的方式格式化数组:

function format_array($array){
    return implode(',',$array);
  }
}

如 …

$sql = "SELECT * FROM sales WHERE product_id IN (".format_array($clients).")";

这导致了这个查询

SELECT * FROM sales WHERE product_id IN(80000016-1302638679,8000003B-132992400)

……而且这个错误

‘where子句’中的未知列’8000003B’

我究竟做错了什么?任何帮助是极大的赞赏!如果需要,我可以澄清这个问题:)

解决方法

一个更好的方法

您在评论中提到您正在使用CodeIgniter.除非你正在制作一些非常复杂的东西,否则当你内置where_in时,没有任何实际的理由可以构建自己的自制查询.

如果这不起作用,那么就有了很好的产品escape.

好的,所以,你有大多数人说你需要引用这些项目并给你这个:

function createInClause($arr)
{
    return '\'' . implode( '\',\'',$arr ) . '\'';
}

但如果您有可能输入有问题(例如'); DROP TABLE STUDENTS; --),这实际上是不够的.为防止这种情况,您需要确保检查SQL injection:

function createInClause($arr)
{
    $tmp = array();
    foreach($arr as $item)
    {
        // this line makes sure you don't risk a sql injection attack
        // $connection is your current connection
        $tmp[] = MysqLi_escape_string($connection,$item);
    }
    return '\'' . implode( '\',$tmp ) . '\'';
}

原文地址:https://www.jb51.cc/mssql/84032.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐