2012-04-05 14 views
0

我正在使用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 

第二個給我這樣的輸出:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '[email protected]' for key 'email_index'' in /../applicationFolder/libraries/Doctrine/DBAL/Statement.php:131 Stack trace: #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 on line 131

我俯瞰簡單的東西?有關如何正確地對CI/Doctrine進行獨立驗證的幫助?謝謝!

注意:在將'database'添加到autoload配置後,我能夠得到$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; 
    } 
} 
1

我只是遇到同樣的問題,它是使用CodeIgniter 2.1的問題。
它有兩個修復程序。

1.從回購源升級笨,它具有其他的問題爲它的修復和許多其它修復:
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; 
    } 

這應該解決它。

0

至於我的解決方案是在表名「用戶」,在您的驗證規則中,它必須是:$this->form_validation->set_rules('email', 'E-mail', 'required|valid_email|is_unique[Users.email]'); - 表名是uppercased。 我希望這可以幫助某人。

此外,在笨2.0,你應該使用:

is_unique[db,table_name,field_name] 
1

這裏是100%工作液:

- >去系統/庫/ form_validation.php

- >去到第954行(您可能是950s左右)

- >用以下代碼替換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之前加載數據庫。

0

只需在_construct函數中加上$this->load->database();函數