加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 数据库 > MsSql > 正文

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

发布时间:2020-05-24 19:57:21 所属栏目:MsSql 来源:互联网
导读:我正在尝试在数据库中查询“product_id”包含在产品ID数组中的记录. 该数组是多选输入( select)的结果,如下所示: $clients = Array ( [0] = 80000016-1302638679 [1] = 8000003B-1329924004 ) 我想将该数组传递给SQL语句的“IN”子句,例如: $sql = SELECT *

我正在尝试在数据库中查询“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 ) . ''';
}

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读