为SQL“ IN”子句格式化PHP数组
我正在尝试在数据库中查询产品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'
回答:
回答:
您在注释中提到您正在使用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 ) . '\'';
}
以上是 为SQL“ IN”子句格式化PHP数组 的全部内容, 来源链接: utcz.com/qa/423235.html