0

Doctrine2.2.1とCodeIgniter2.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

2番目は私にこの出力を与えます:

致命的なエラー:キャッチされない例外'PDOException'とメッセージ'SQLSTATE [23000]:整合性制約違反:1062/../applicationFolder/libraries/Doctrine/DBAL/Statementのキー'email_index''のエントリ'email@address.com'が重複しています.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 \ ClassMetadatain/.。/applicationFolder/libraries/Doctrine/DBAL/Statement.php、131行目

シンプルなものを見落としていますか?CI / Doctrineを使用してDBに対して一意の検証を正しく行う方法について何か助けはありますか?ありがとう!

注:自動ロード構成に「データベース」を追加した後、作業を​​開始できましたが$this->form_validation->set_rules('email', 'E-mail', 'required|valid_email|is_unique[users.email]');、これによりDoctrineが完全に機能しなくなります。

4

5 に答える 5

1

私はこれと同じ問題に直面しました。それはCodeIgniter2.1の問題でした。
これには2つの修正があります。

1.リポジトリソースからCodeIgniterをアップグレードします。これには、それに対する修正と、他の問題に対する他の多くの修正が含まれています。Githubのリポジトリ
ソース

また

2.system/libraries/Form_validation
Go to lineを開き、関数を次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;
    }

これで修正されるはずです。

于 2012-06-04T17:17:00.350 に答える
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

これが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オブジェクトが原因でした。

于 2013-08-16T00:31:53.430 に答える
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]
于 2013-01-26T10:33:15.780 に答える
0

関数を追加するだけ$this->load->database();です_construct

于 2013-11-06T23:50:42.310 に答える