最近我创建了一个简单的注册表单,当我尝试保存数据时,如果我输入现有的用户名或电子邮件,我会收到一条错误,说明该查询已停止,因为该字段已存在
在某些情况下,这是一个很棒的功能,我可以在电子邮件中使用它。
我不确定我是否必须在表单验证器或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'
....
像我说的那样,我可以将此错误用于电子邮件,因为我想要唯一的电子邮件,但我不知道如何捕获此错误并以更好的格式显示它,可能就像验证错误。
关于这个问题的任何想法?
感谢
答案 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
条目。
希望这有帮助。