循环遍历数组并在MYSQL中执行语句

时间:2018-03-15 20:23:48

标签: mysql arrays cakephp

是否可以在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命令吗?

3 个答案:

答案 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 );