我使用的是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):Mictrine \ ORM \ Persisters \ BasicEntityPersister-> executeInserts()#3 /../applicationFolder/libraries/Doctrine/ORM/UnitOfWork.php(304):Doctrine \ ORM \ UnitOfWork-> executeInserts(Object中的对象(Doctrine \ ORM \ Mapping \ ClassMetadata)。第131行的./applicationFolder/libraries/Doctrine/DBAL/Statement.php
我忽略了一些简单的事情吗?有关如何使用CI / Doctrine正确对数据库进行唯一验证的任何帮助?谢谢!
注意:在将“数据库”添加到自动加载配置后,我能够使$this->form_validation->set_rules('email', 'E-mail', 'required|valid_email|is_unique[users.email]');
正常工作,但这会完全破坏Doctrine。
答案 0 :(得分: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;
}
}
答案 1 :(得分:1)
我刚遇到同样的问题,这是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;
}
这应该解决它。
答案 2 :(得分:1)
这是100%可行的解决方案:
- >转到system / libraries / 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之前没有加载数据库。
答案 3 :(得分:0)
至于我,解决方案在表名“User”中,在您的验证规则中它必须是:$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]
答案 4 :(得分:0)
只需在$this->load->database();
功能
_construct
即可