一尘不染

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

mysql

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

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

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

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

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

…但这是行不通的(错误:)Message: Array to string conversion

一些帖子建议使用此函数以适合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)

…以及此错误:

Unknown column '8000003B' in 'where clause'

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


阅读 601

收藏
2020-05-17

共1个答案

一尘不染

有一个更好的方法

您在注释中提到您正在使用CodeIgniter。除非您使事情变得异常复杂,否则没有实际的理由应该在构建时构建自己的家庭式查询where_in

如果那不起作用,那么就很好escape


好的,所以,您大多数人都说您需要引用这些项目,并为此提供了:

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

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

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 ) . '\'';
}
2020-05-17