如何在Zend Framework 2中允许数据库中的重复条目?

时间:2012-10-11 06:34:17

标签: php forms validation duplicates zend-framework2

最近我创建了一个简单的注册表单,当我尝试保存数据时,如果我输入现有的用户名或电子邮件,我会收到一条错误,说明该查询已停止,因为该字段已存在

在某些情况下,这是一个很棒的功能,我可以在电子邮件中使用它。

我不确定我是否必须在表单验证器或config.php或我的模块中设置它。

这是我的保存方法:

public function saveUser(User $user)
{

    $data = array(
        'username'  => $user->username,
        'email'     => $user->email,
        'password'  => $user->password,
    );

    $id = (int) $user->user_id;

    if ($id == 0) {
        $this->insert($data);
    } elseif ($this->getUser($id)) {
        $this->update(
            $data,
            array(
                'user_id' => $user_id,
            )
        );
    } else {
        throw new \Exception('Form id does not exist');
    }
}

这是一个简短的错误:

Statement could not be executed
...
QLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'admin' for key 'username'
....
像我说的那样,我可以将此错误用于电子邮件,因为我想要唯一的电子邮件,但我不知道如何捕获此错误并以更好的格式显示它,可能就像验证错误。

关于这个问题的任何想法?

感谢

3 个答案:

答案 0 :(得分:2)

如果您使用Zend_Form创建表单,可以使用Zend_Validate_Db_NoRecordExists检查电子邮件是否已存在。

答案 1 :(得分:1)

这是SQL server返回的错误。要摆脱这种情况,您需要从字段UNIQUE KEY中删除username

如果用户电子邮件是重复的,那么显示“好的错误消息”,我担心你唯一的选择就是在执行INSERT之前检查它是否存在。

我曾经有过抛出Database_UniqueKey_Exception( $field)的数据库模型,它允许你以非常时尚的方式做到这一点,但是AFAIK Zend不支持对唯一键问题的特殊处理,你必须要么解析错误信息(I不会去那里)或提前检查。

答案 2 :(得分:0)

这是一个如何实现你想要的例子。 Zend Framework: Validate duplicate database entry

它使用MySQL PDOException code: 23000来检查是否发生了重复的条目异常,并将错误消息附加到表单。这样,您就不需要进行额外的数据库查询来检查重复的username条目。

希望这有帮助。