0

我正在使用 Doctrine 2.2.1 和 CodeIgniter 2.1.0

我正在尝试对表单中的电子邮件地址字段进行唯一验证 - 只是为了确保该字段不存在于数据库中。

我首先在这里查看这个好的(但过时的)教程和这里的 CodeIgniter 文档

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/DBAL/Statement 中的键“email_index” .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/libraries/Doctrine/DBAL/Statement.php 在第 131 行

我忽略了一些简单的事情吗?有关如何使用 CI/Doctrine 正确对数据库进行唯一验证的任何帮助?谢谢!

注意:在将“数据库”添加到自动加载配置后,我能够开始$this->form_validation->set_rules('email', 'E-mail', 'required|valid_email|is_unique[users.email]');工作,但是,这完全破坏了 Doctrine。

4

5 回答 5

1

这是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 之前没有加载数据库。

于 2013-08-16T00:31:53.430 回答
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;
    }
}
于 2012-04-06T17:30:03.397 回答
1

我刚刚遇到了同样的问题,这是 CodeIgniter 2.1 的问题。
有两个修复它。

1.从 repo 源升级 CodeIgniter,它有针对它的修复和针对其他问题的许多其他修复:
Github 上的 Repo Source

或者

2.打开system/libraries/Form_validation
Go to line954并将函数替换为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;
    }

这应该解决它。

于 2012-06-04T17:17:00.350 回答
0

Just add $this->load->database(); in the _construct function

于 2013-11-06T23:50:42.310 回答
0

至于我的解决方案是在表名“用户”中,在你的验证规则中它必须是:$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]
于 2013-01-26T10:33:15.780 回答