在更新它插入另一行

时间:2011-04-25 21:00:59

标签: cakephp cakephp-1.3

我检查下面的数据,如果表格字段中有数据,则更新表格。问题是如果我单击按钮两次(它的ajax)它将插入第二行。我该怎样防止它。 感谢

function update() { 
if (!empty($this->data)) {

                $this->Test->saveAll($this->data['Test'])


        }
}

2 个答案:

答案 0 :(得分:1)

问题是表单没有id字段,所以cakephp插入一个新行。

简单的方法是检查在保存之前是否存在具有相同值的另一条记录。

您可以检查模型的beforeSave()函数,而不是Controller操作。

http://book.cakephp.org/#!/view/1052/beforeSave

答案 1 :(得分:0)

你应采取双管齐下的方法来防止这种情况:

首先,在提交时禁用提交按钮。例如在jQuery中:

$('#form_id').submit(function(event) {
    event.preventDefault();
    $('input[type=submit]', this).attr('disabled', 'disabled');
    // submit form via ajax...
}

其次,执行理性检查服务器端以防止重复保存。例如,在一分钟左右内提交的两个相同记录将被视为错误。我可能会通过在其中一个始终需要的字段上创建自定义验证规则来实现此目的。在你的模型中:

var $validate = array(
    'myfield' => array(
        'rule' => 'duplicateCheck',
        'message' => 'Duplicate record'
    )
);

function duplicateCheck() {
    $conditions = array(
        'Model.field1' => $this->data['Model']['field1'],
        ...
        'Model.created >' => date("Y-m-d H:i:s", time() - 60)
    );
    return !$this->hasAny($conditions);
}

然后在您的控制器中,如果保存失败,我会将用户重定向到现有记录,这是因为该特定的验证规则。这让用户继续前进而不关心任何问题。

function add() {
    if(isset($this->data)) {
        if($this->Model->save($this->data)) {
            ...
        } else {
            if(isset($this->Model->validationErrors['myfield'])) {
                // find the existing record and redirect user to view it
            }
        }
    }
}