2011-02-08 6 views
0

メソッドの入力検証をどのように処理すればよいですか?
これらのうち、どちらが正しい方法ですか?またはより良い方法があります
このメソッドはコンストラクタによって呼び出され、$ prodIDはユーザー入力またはdbから来る可能性があります。あなたの入力を検証する際メソッドのプロパティ入力の検証

private function fill_data1($prodID) 
{ 
    //Way 1 
    filter_var($prodID, FILTER_VALIDATE_INT, array('options'=>array('min_range'=>1, 'max_range'=>1000000))); 
    if (is_null($prodID)) { 
     return FALSE; 
    } elseif ($prodID === FALSE) { 
     return FALSE; 
    } 
    $prod = getArtData($prodID); 
    $this->set_id($prod['artID']); 
    $this->set_name($prod['artName']); 
    $this->set_price($prod['precio']); 
} 

private function fill_data(2$prodID) 
{ 
    //Way 2 
    filter_var($prodID, FILTER_VALIDATE_INT, array('options'=>array('min_range'=>1, 'max_range'=>1000000))); 
    if (is_null($prodID) || $prodID === FALSE) 
    { 
     die('invalid input for prodID (' . $prodID . '). It has to be an integer > 0'); 
    } 
    $prod = getArtData($prodID); 
    $this->set_id($prod['artID']); 
    $this->set_name($prod['artName']); 
    $this->set_price($prod['precio']); 
} 

答えて

1

オプション3:例外を使用し、IDの検証を可能な限りデータに近づけます。

public function getArtData($id) { 
    if (!is_int($id) || $id <= 0) { 
     throw new InvalidIdentifierException(
       "Article ID $id must be a valid, positive integer."); 
    } 
    ... 
} 

falseを返すの問題点は、を処理し、はそれをスキップするために、戻り値をチェックしなければならないということです。それを扱う場所(プレゼンテーション層)が検証された場所(データ層)から削除されたいくつかの関数呼び出しである場合、各レベルでfalseをチェックする必要があります。例外は、それをキャッチする最初の関数まで伝播し、途中の各関数の残りのコードをバイパスします。

die()を呼び出すことは、それ自身の問題を引き起こします。単体テストは難しく、エラー表示コードを失敗の箇所に置く必要があります。 Webサービスからコードを使用する場合はどうなりますか?

0

あなたはdie()を使用しないでください。
ユーザーには適切なエラーメッセージが表示され、正しい入力方法がわかります。

したがって、私はあなたに最初の方法をお勧めします。
アーキテクチャによっては、falseを返す代わりに例外をスローする方が適切かもしれません。

+0

はい、少し厳しいですが、確かにユーザーはメッセージを表示します(ページ上で唯一のものになります) –

+0

入力が無効な場合は問題です。実行はすぐに停止しなければならず、次のステップはdb write ... –

+0

私はこのコメントボックスを嫌い、自動的にsubmitを入力してください...ここで例外を使用する正しい方法は? –