我正在尝试在数据库中查询产品ID数组中包含“ product_id”的记录。
该数组是多重选择输入(<select>)的发布结果,如下所示:
<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。
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'
我究竟做错了什么? 任何帮助是极大的赞赏!如果需要,我可以澄清这个问题:)
您在注释中提到您正在使用CodeIgniter。除非您使事情变得异常复杂,否则没有实际的理由应该在构建时构建自己的家庭式查询where_in。
where_in
如果那不起作用,那么就很好escape。
escape
好的,所以,您大多数人都说您需要引用这些项目,并为此提供了:
function createInClause($arr) { return '\'' . implode( '\', \'', $arr ) . '\''; }
但是,如果您有可能输入有问题的信息(例如,'); DROP TABLE STUDENTS; --。),这确实是不够的。为了防止这种情况,您需要确保检查SQL注入:
'); DROP TABLE STUDENTS; --
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 ) . '\''; }