唯一验证不起作用,我该怎么办?

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();

【讨论】:

以上是关于唯一验证不起作用,我该怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

element.setCustomValidity 似乎不起作用

NestJS MongoDB 唯一字段不起作用

ceph 构建指令不起作用。接下来我该怎么办?

jquery验证动态表单输入的插件不起作用

升级后 Grails 验证不起作用

Razor 页面流畅的验证服务器端不起作用