是否可以在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命令?
发布于 2018-03-16 20:10:42
您的代码是不安全的,因为可能会注入SQL。所以攻击者可以在您的SQL查询中执行他想要的任何东西。
如果这真的是CakePHP代码,你为什么不使用?您应该阅读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
]);
}发布于 2018-03-16 04:35:35
您可能只需要将连接的值用引号括起来(因为它不是数字)。
如下所示:
$this->execute('DELETE from categories WHERE category_id = "'.$value['category_id'].'"');但是,按照其中一条评论中的建议执行DELETE ... WHERE会产生更好的性能。
另外,请注意,如果数据来自用户,那么它可能容易受到SQL注入的影响,因此您应该阅读并使用参数化查询,而不是连接。
发布于 2018-03-16 07:34:48
使用IN子句
$list = array(); foreach ($row as $item) {
$list[] = "'{$item['category_id']}'";
}
$sql = 'DELETE from categories WHERE category_id IN ('.implode(',',$list).')';
$this->execute( $sql );https://stackoverflow.com/questions/49308551
复制相似问题