我正在尝试在数据库中查询“product_id”包含在产品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'
我做错了什么?任何帮助是极大的赞赏!如果需要,我可以澄清这个问题:)
答案 0 :(得分:7)
尝试将你的ID放在引号中:
function format_array($array){
return "'" . implode("', '", $array) . "'";
}
}
正如cwallenpoole指出的那样,如果你还没有,你应该逃避弦乐。不转义字符串是非常危险的,特别是如果你有一个公共应用程序。
答案 1 :(得分:5)
您在评论中提到您正在使用CodeIgniter。除非你正在制作一些非常复杂的东西,否则当你内置where_in
时,你应该建立自己的自制查询。
如果这不起作用,那么就有很好的'{3}}。
好的,所以,你有大多数人说你需要引用这些项目并给你这个:
function createInClause($arr)
{
return '\'' . implode( '\', \'', $arr ) . '\'';
}
但如果您有可能输入可疑的内容(例如escape
),这实际上是不够的。为了避免这种情况,您需要确保检查'); 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 ) . '\'';
}
答案 2 :(得分:2)
您需要将80000016-1302638679
放在引号中。否则它假定你正在减法。
return "'".implode("', '", $array)."'";
答案 3 :(得分:2)
使用此功能
function format_array($array){
return implode("','", $array);
}
}
这个查询
$sql = "SELECT * FROM sales WHERE product_id IN ('".$clients."')";
答案 4 :(得分:0)
您需要将它们放在引号中,如
SELECT * FROM sales WHERE product_id IN ('80000016-1302638679', '8000003B-132992400')
答案 5 :(得分:0)
您需要将商品包装在引号中。这是一个快速修复:
$clientIds = "";
foreach ($clients as $client) {
$clientIds .= ($clientIds == "" ? "" : ", ") . "'".mysqli_escape_string($client)."'";
}
$sql = "SELECT * FROM sales WHERE product_id IN (".$clientIds.")";
答案 6 :(得分:-1)
将值置于引号之下:
SELECT * FROM sales WHERE product_id IN ('80000016-1302638679', '8000003B-132992400')