2009-04-09 42 views
5

Webアプリケーションデータベースにユニークキー(date + userid)のテーブルがあります。私は既存のdateuseridでレコードを挿入しようとすると私は、次のエラーが表示さ:CodeIgniterでデータベースからエラーを処理するためのベストプラクティス

dupicate key in table 

を私はMySQLのエラー番号とメッセージを使用するために必要なので、私は、アプリケーションの設定で、データベースのデバッガをオン。今私はこのエラーを処理する必要があります。私はコントローラでハードコードされた定数を使用することができますが、それは良い考えではないと思います。私は多くの場所でデータベースのエラー処理を必要とし、私はCodeIgniterのエラー処理が好きではありません。データベースエラーの処理に関するベストプラクティスは何ですか?

$this->db->_error_number(); 
$this->db->_error_message(); 

が、この文書化されていない機能を、次のリリースで、これは変更することができます:

答えて

9

は、我々は、これらのように私たちのプロジェクトの構築に使用します。もちろん あなたは単にmysqlのエラー・ハンドル機能のための標準のPHPを使用することができます。

mysql_errno() 
mysql_error() 

は内部CIこれらの関数を使用しています。

私としてベストプラクティスは、カスタムモデルの基底クラスでの使用(BaseModel)

$this->db->_error_number(); 

と決定誤差、

$this->db->_error_message(); 

あなたのすべてのモデルから取られた情報のエラーメッセージで次のスロー例外がありますBaseModelから派生し、dbエラーの最後の要求をチェックするメソッドを呼び出すと、Modelが例外を処理し、それを処理する必要があります(さらにログするかもしれません)。もちろん、結果の値として検査結果を実装し、

+0

私はこれも機能します。 BaseModelそれは良いアイデアだ、と私はそれについて考える。ありがとう。 モデル処理例外を使用したIMOスロー例外メソッドは少し難しく、透過的ではありません。クエリの実行直後に単純な処理エラーが必要です。 decerissionが_error_number()に依存するようにする必要があります。 – drnk

+0

これらはコンストラクタではありませんが、良い答えです。 – Zack

0

私はあなたがルールを定義する必要がフォームを送信しながら、私はこの

$this->form_validation->set_rules('email', 'Email', 'required|max_length[32]|valid_email|callback_email_available'); 

をお勧めします。このために別の提案を持っています。常にデータベースと対話するためにコールバックを使用

コントローラのコールバックメソッド

public function email_available($str) 
{ 
    // You can access $_POST variable 
    $this->load->model('mymodel'); 
    $result = $this->mymodel->emailAvailability($_POST['email']); 
    if ($result) 
    { 
     $this->form_validation->set_message('email_available', 'The %s already exists'); 
     return FALSE; 
    }else{ 
     return TRUE; 
    } 
} 

とモデル法

public function emailAvailability($email) 
{ 
    $this->db->where('email',$email); 
    $query = $this->db->get('tablename'); 
    return $query->row(); 
} 

あなたが常に前面に、データベースのエラーを回避し、ユーザーが物事を見る得ることができます。この方法もっといい方法。あなたはフォームの検証があなたのためにすべてを処理しているので、dbエラーを処理する必要はありません。

関連する問題