5

Webアプリケーションデータベースに一意のキー( date+ )を持つテーブルがあります。userid既存のレコードを挿入しようとするdateuserid、次のエラーが発生します。

dupicate key in table

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

4

2 に答える 2

10

プロジェクトの構築では、次のように使用します。

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

しかし、これは文書化されていない機能であり、次のリリースでは変更される可能性があります。もちろん、mysql エラー ハンドル関数に標準の php を使用することもできます。

mysql_errno()  
mysql_error()

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

私にとってベスト プラクティスは、カスタム モデルの基本クラス (BaseModel) で使用することです。

$this->db->_error_number();

エラーを判断し、次の情報エラー メッセージを使用して例外をスローします。

$this->db->_error_message();

すべてのモデルは BaseModel から派生し、db エラーの最後のリクエストをチェックするメソッドを呼び出します。モデルは例外を処理し、それを処理する必要があります (追加でログに記録される場合があります)。もちろん、チェック結果を結果値として実装し、例外のスローを回避できます。

于 2009-04-09T13:22:37.897 に答える
1

これについては別の提案がありますが、これをお勧めします

$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 エラーを処理する必要はありません。

于 2013-01-22T08:10:37.110 に答える