是否可以在mysql中循环遍历此数组并执行delete语句,其中category_id列等于下面该数组中循环的当前值。
$row = [
'type' => '3',
'name' => 'Warez',
'category_id' => 'IAB26-2',
'parent_category_id' => 'IAB26'
],
[
'type' => '3',
'name' => 'Spyware/Malware',
'category_id' => 'IAB26-3',
'parent_category_id' => 'IAB26'
],
[
'type' => '3',
'name' => 'Copyright Infringement',
'category_id' => 'IAB26-4',
'parent_category_id' => 'IAB26'
],
[
'type' => '3',
'name' => 'Uncategorized',
'category_id' => 'IAB24'
]
我试过这个
foreach($row as $value) {
$this->execute('DELETE from categories WHERE category_id = '.$value['category_id'].'');
}
似乎无法正常工作。这种操作有更好的Sql命令吗?
答案 0 :(得分:1)
您的代码不安全,因为可以注入SQL。因此,攻击者可能会在SQL查询中执行他想要的任何内容。
如果这真的是CakePHP代码,为什么不使用ORM?您应该阅读https://book.cakephp.org/3.0/en/orm.html表对象和删除数据部分。如果不是,请不要使用错误的标签。
假设这是在表对象中完成的,最简单的方法是:
$ids = Hash::extract($data, '{n}.category_id');
if (!empty($ids)) {
$this->deleteAll([
'category_id IN' => $ids
]);
}
答案 1 :(得分:0)
你可能只需要用引号包装你连接的值(因为它不是数字)。
这样的事情:
$this->execute('DELETE from categories WHERE category_id = "'.$value['category_id'].'"');
但是,按照其中一条评论中的建议执行DELETE ... WHERE
会产生更好的效果。
另请注意,如果数据来自用户,那么它可能会受到SQL注入的影响,因此您应该阅读并使用参数化查询而不是连接。
答案 2 :(得分:-1)
使用IN子句
$list = array(); foreach ($row as $item) {
$list[] = "'{$item['category_id']}'";
}
$sql = 'DELETE from categories WHERE category_id IN ('.implode(',',$list).')';
$this->execute( $sql );