2012-04-05 6 views
0

私はDoctrine 2.2.1とCodeIgniter 2.1.0を使用しています独自の検証が機能しない、どうすればよいですか?

フォームから電子メールアドレスフィールドで一意の検証をしようとしています - フィールドがデータベースに存在しないことを確認するだけです。

私はこの良い(しかし、旧式)チュートリアルhereとCodeIgniterのドキュメントhere

CIのドキュメントは[table.field] is_uniqueを用いた例を示しており、また、コールバックを使用すると、これを行うことができると言うように見えるをチェックして始めたが、私はそのコードがどのようにしているのか把握していないようで、自分自身で機能させることはできません。

私はこの試みた:

$this->form_validation->set_rules('email', 'E-mail', 
       'required|valid_email|is_unique[users.email]'); 

これ:(CodeIgniterの例からほぼそのままcribbedれる)

$this->form_validation->set_rules('email', 'E-mail', 'callback_email_check'); 

どちら作業。最初は私に次のような出力が得られます。

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を使用してDBに対して独自の検証を正しく行う方法についての助けはありますか?ありがとう!

注:自動ロード設定に 'データベース'を追加した後に$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との問題でした。
2つの修正があります。

レポ源から1アップグレード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; 
    } 

これで解決します。

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] 
1

は100%の作業のソリューションです:

- >行く - >

form_validation.phpシステム/ライブラリ/にアクセスしてください(あなたは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オブジェクトでした。

0

_constructファンクションに$this->load->database();を追加するだけで

関連する問題