【发布时间】:2014-01-23 06:23:54
【问题描述】:
function delete_group($db) {
$ids = Parameters::get('ids');
$ids = implode(',', $ids); // now a string like '5,6,7'.
add_to_log($ids);
try {
$stmt = $db->prepare("DELETE FROM mytable WHERE id IN (:ids)");
$stmt->bindParam(':ids', $ids, PDO::PARAM_STR);
$stmt->execute();
response('success', 'success', NULL);
}
catch (PDOException $e) {
response('error', 'Delete group failed.', NULL);
}
}
此代码不起作用:仅删除了第一行。但是如果我这样做了
$stmt = $db->prepare("DELETE FROM mytable WHERE id IN ($ids)");
相反(只需插入字符串),它可以工作,尽管代码存在 SQL 注入安全问题。如何使其工作并保持安全?
【问题讨论】:
-
你不能那样做。您需要单独绑定它们; SQL 绑定参数不是任意变量插值/连接,而是在接受的地方传递的单个值。
-
如果我没记错的话,PHP PDO 不支持
WHERE IN用于准备好的语句。您必须做一些额外的工作来设置它(根据数组的大小创建 X?参数或在数组上执行implode())。