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

前端之家收集整理的这篇文章主要介绍了格式化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.f2er.com/mssql/84032.html

猜你在找的MsSQL相关文章