2011-08-07 5 views
0

私は非常に簡単な質問があります。dbエラーの処理とユーザーへの表示

整形式警告にデータベースエラーを関連付ける方法はありますか?

私は何を意味することは、たとえばユーザーがサイトに登録されていると、次のエラーが発生したデータベースに保存するときに、彼/彼女が選択したユーザ名がまだ取られてされています

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'peter' for key 'username' 

私は本当にドンこれをユーザーに表示したいのですが、具体的には次のように表示します。 "選択したユーザー名は既に取得済みです"

エラーを特定して警告を出力するにはどうすればよいでしょうか?事前

答えて

0

ありがとうございます、ユーザー名が取られたかどうかを確認するために最初に選択クエリを実行します。そうでない場合に限り、あなたはそれを挿入します。

理想的には、テーブルをロックするかトランザクションを使用しますが、実際には2つのクエリが互いに近くにあればOKです。

+0

もっと一般的な方法はありませんか?重複したエントリだけでなく、 – doubter

+0

データベースのエラーはどうやって事前に知っていますか?もしデータベースが "Disk full"と言ったら、それを重複したユーザ名として扱いますか?正しく書かれたコードでは、データベースのエラーは決して予想されません。エラーが発生した場合、コードを完全に中止し、ユーザーに入力の変更を依頼しないでください。もっと一般的なやり方でこれをやろうとしないでください。通常、データベースクエリの周りに "ガードコード"を追加して、正常な活動の中で決して失敗しないようにしてください。 – Ariel

+0

返信ありがとう – doubter

0

ユーザ名が取られている場合は、最初に確認することができます:あなたはカスタムエラー文字列を渡すことができ

$num_rows_aff = SELECT * FROM table where username = 'peter'; 

If($num_rows_aff > 0) 
{ 
    // Username exists, Output "Username is taken"; 
}else{ 
    // Insert username into database 
} 
+0

私はそれについて考えましたが、私はより一般的なアプローチを望んでいました...重複フィールドだけでなく、 返信いただきありがとうございます。 – doubter

0

存在するようにあなたは、いくつかの基本的なデータベース機能を書いてみてください()など、。このような何か:

<?php 

class DB { 

    private $_instance; 

    public function __construct() { 
     $this->_instance = new MySQLI('server','username','password','database'); 
    } 

    public function exists($sql, $msg) { 
     $result = $this->_instance->query($sql); 

     if ($result->num_rows > 0) { 
      throw new FrontDBException($msg); 
     } 

     return false; 
    } 

} 

class FrontDBException extends Exception { 
    public function __toString() { 
     echo($this->getMessage()); 
    } 
} 

$db = new DB(); 

try { 
    $db->exists('SELECT id FROM users WHERE username="' . $username . "'", 
      'Username is already taken.'); 
} catch(FrontDBException $e) { 
    echo($e); 
} 

?> 

しかし、あなたは本当にあなただけの基本的なクエリを実行しているとき、あなたは一種の特定の機能でそれをラップする必要があり、入ってくるエラーを予測することはできません。

+0

あなたはそのようなエラーなどを解析することができると思った – doubter

+0

まあ、おそらく、1062はおそらく '重複エントリ'のコードです。しかし、すべてのコードに対してエラーメッセージを書き込まなければなりません。正規表現でさえ、さらにそれを取りたい場合。 – Esben

関連する問題