独特的验证不起作用,我该怎么做?

时间:2012-04-05 22:08:37

标签: php validation doctrine-orm codeigniter-2

我使用的是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。

5 个答案:

答案 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即可