唯一验证不起作用,我该怎么办?
Posted
技术标签:
【中文标题】唯一验证不起作用,我该怎么办?【英文标题】:unique validation not working, how do I..? 【发布时间】:2012-04-05 22:08:36 【问题描述】:我正在使用 Doctrine 2.2.1 和 CodeIgniter 2.1.0
我正在尝试对表单中的电子邮件地址字段进行唯一验证 - 只是为了确保该字段不存在于数据库中。
我首先查看了这个很好(但已经过时)的教程 here 和 CodeIgniter 文档 here
CI 文档显示了使用 is_unique[table.field] 的示例,并且似乎说使用回调可以做到这一点,但我似乎没有掌握该代码是如何做到的,而且我自己也无法让它工作。
我试过这个:
$this->form_validation->set_rules('email', 'E-mail',
'required|valid_email|is_unique[users.email]');
还有这个:
$this->form_validation->set_rules('email', 'E-mail', 'callback_email_check');
(几乎是从 CodeIgniter 示例中逐字记录的)
都不行。第一个给我以下输出:
A php Error was encountered
Severity: Notice
Message: Undefined property: Signup_form::$db
Filename: libraries/Form_validation.php
Line Number: 954
Fatal error: Call to a member function limit() on a non-object in /../systemFolder/libraries/Form_validation.php on line 954
第二个给了我这个输出:
致命错误:未捕获的异常“PDOException”和消息“SQLSTATE[23000]:完整性约束违规:1062 重复条目“email@address.com”,用于 /../applicationFolder/libraries/Doctrine/ 中的键“email_index” DBAL/Statement.php:131 堆栈跟踪:#0 /../applicationFolder/libraries/Doctrine/DBAL/Statement.php(131): PDOStatement->execute(NULL) #1 /../applicationFolder/libraries/Doctrine/ ORM/Persisters/BasicEntityPersister.php(239): Doctrine\DBAL\Statement->execute() #2 /../applicationFolder/libraries/Doctrine/ORM/UnitOfWork.php(896): Doctrine\ORM\Persisters\BasicEntityPersister- >executeInserts() #3 /../applicationFolder/libraries/Doctrine/ORM/UnitOfWork.php(304): Doctrine\ORM\UnitOfWork->executeInserts(Object(Doctrine\ORM\Mapping\ClassMetadata in /../applicationFolder/ library/Doctrine/DBAL/Statement.php 第 131 行
我是否忽略了一些简单的事情?有关如何使用 CI/Doctrine 正确对数据库进行唯一验证的任何帮助?谢谢!
注意:在将“数据库”添加到自动加载配置后,我能够让 $this->form_validation->set_rules('email', 'E-mail', 'required|valid_email|is_unique[users.email]');
工作,但是,这完全破坏了 Doctrine。
【问题讨论】:
【参考方案1】:这似乎解决了问题。不确定这是最好还是最优雅的方式,但它确实有效。
$this->form_validation->set_rules('email', 'E-mail',
'required|valid_email|callback_email_check');
public function email_check($str)
$user = $this->doctrine->em->getRepository('Entities\User')->findOneBy(array('email' => $str));
if (isset($user))
$this->form_validation->set_message('email_check', 'This email address is already in use');
return FALSE;
else
return TRUE;
【讨论】:
【参考方案2】:我刚遇到同样的问题,这是 CodeIgniter 2.1 的问题。 有两个修复它。
1. 从 repo 源升级 CodeIgniter,它有针对它的修复以及针对其他问题的许多其他修复:Repo Source at Github
或
2.打开system/libraries/Form_validation
转到954
行并将函数is_unique()
替换为:
public function is_unique($str, $field)
list($table, $field) = explode('.', $field);
if (isset($this->CI->db))
$query = $this->CI->db->limit(1)->get_where($table, array($field => $str));
return $query->num_rows() === 0;
return FALSE;
这应该可以解决它。
【讨论】:
【参考方案3】:这是 100% 可行的解决方案:
->转到系统/库/form_validation.php
->转到第 954 行(你可能是 950 多岁)
->用下面的代码替换is_unique函数
public function is_unique($str, $field)
list($table, $field)=explode('.', $field);
$this->CI->load->database('default');
$query = $this->CI->db->limit(1)->get_where($table, array($field => $str));
return $query->num_rows() === 0;
其实错误是因为未知$db对象,因为调用$db之前没有加载数据库。
【讨论】:
【参考方案4】:对我来说,解决方案是在表名“用户”中,在您的验证规则中,它必须是:$this->form_validation->set_rules('email', 'E-mail', 'required|valid_email|is_unique[Users.email]');
- 表名是大写的。
我希望这对某人有所帮助。
在 CodeIgniter 2.0 中你也应该使用:
is_unique[db,table_name,field_name]
【讨论】:
【参考方案5】:只需在_construct
函数中添加$this->load->database();
【讨论】:
以上是关于唯一验证不起作用,我该怎么办?的主要内容,如果未能解决你的问题,请参考以下文章