UpdateAll的魔力

时间:2014-06-17 08:30:07

标签: cakephp cakephp-2.0

我在cakephp for和updateAll查询中编写了以下代码,如

$this->loadModel('User');
$this->User->updateAll(array('stauts'=>'active'),array());

上面代码的等效SQL查询就像这样生成

UPDATE User SET status='active' WHERE 0 = 1;

当我在cakephp中编写updateAll时,如下所示

$this->loadModel('User');
$this->User->updateAll(array('stauts'=>'active'));

此代码的等效SQL查询生成如下

UPDATE User SET status='active';

我不知道为什么会这样。

如果您不理解我的问题,请在评论中告诉我,我会在短期内解释。

1 个答案:

答案 0 :(得分:16)

这是一个安全问题

根据用户输入,条件通常是动态的。考虑一下这样的控制器动作:

function enableAll() {
    $conditions = array();

    ...

    if (whatever) {
        // Update only today's records
        $conditions['created > '] = $yesterday;
    }

    if ($this->Auth->user()) {
        // Update only my records
        $conditions['user_id'] = $this->Auth->user('id');
    }

    $this->Widget->updateAll(
        array('active' => 1),
        $conditions
    );
}

逻辑条件可以是以下两种情况之一:

  • 匹配部分记录或无记录的数组
  • 空数组

当它是一个空数组时,开发人员是否意味着更新所有记录,或没有记录?

CakePHP无法确定,但如果通过,则一个空条件数组更可能是一个错误,其意图是什么都不更新。因此,为了保护开发人员不会意外更新所有内容,使用的条件与任何记录都不匹配(WHERE 0 = 1为false - 它始终不匹配任何行。)。

这就是为什么:

// I definitely want to update the whole table
$model->updateAll($update);

的处理方式与此不同:

// mistake? maybe the conditions have been forgotten...
$model->updateAll($update, array());