2012-07-02 130 views
0

在我的PHP Web應用程序中,我通常使用自定義函數驗證用戶輸入,如果輸入與驗證條件不匹配,則返回NULL;如果驗證條件滿足,則返回原始輸入值。因此,一個基本的流程會是這個樣子:返回NULL用於輸入驗證

$user_input = $_POST['fieldname']; 
$user_input = validation_function($user_input); 

if (isset($user_input)) { 
    // do stuff 
} 

關於這樣做的好處是,我可以採取任意數量的用戶輸入,對其進行驗證,然後將它們粘到isset()功能參數,因爲isset()函數需要可變數量的參數。

現在,我一直在閱讀很多有關NULL返回是否很糟糕的問題,並且這個問題"Is returning null bad design?"有一個很好的答案,基本上聲明「不返回null的基本原理是您不必檢查因此,因此您的代碼不需要遵循基於返回值「」的不同路徑。我理解這在應用程序的內部工作中是如何有益的,但是如何將此原則應用於輸入驗證?

問題的關鍵是,我如何處理輸入驗證,而不必像上面提供的代碼示例那樣返回NULL?

回答

0
if(isset($user_input)) 
{ 
$flg = true; 
} 
if($flg) 
{ 
//do stuff 
} 

我想這就是你要找的。你可以設置一個變量true和false作爲我的驗證方式。

0

對於輸入驗證,我總是返回原始值,然後以某種方式將該字段標記爲無效。這是因爲我通常希望顯示每個字段的驗證錯誤消息。而不是一個函數,我會用一個類來跟蹤所有這些要容易得多。

如果您對該方法感興趣,請查看Zend_FormZend_Validate如何協同工作來爲用戶輸入提供可擴展驗證界面。

0

從baig772的回答得出稍微更緊湊的方式:

if(validation_function($user_input)) 
{ 
// do stuff 
} 

validation_function()返回一個布爾值,並基於該決定做什麼。無需isset()。您當然可以在該塊中設置標誌,並稍後在代碼中使用這些標誌。 isset()允許您添加混合變量,但可以根據輸入類型假設需要不同的驗證函數。所以,你可以去這樣的:

if(validation_function_fname($first_name) && validation_function_email($email)) 
{ 
//do stuff 
} 

或者,像這樣:

所有的
$name_ok = validation_function_fname($first_name); 
$email_ok = validation_function_email($email); 

if($name_ok && $email_ok) 
{ 
// do stuff 
} 
1

首先,不要使用isset這樣,你濫用它。

 if at all, use isset here, because 
    this variable *may* actually not be set 
       vvvvvvvvvvvvvvvvvvv 
$user_input = $_POST['fieldname']; 

if (isset($user_input)) { 
    ^^^^^^^^^^^^^^^^^^ 
do not use isset here, because 
this variable is definitely set 

isset具有特定目的並用於正確的錯誤處理/抑制。如果您以這種方式使用isset,您只能通過抑制錯誤輸入變量的錯誤報告來讓您的生活更加艱難。

然後,你應該推廣你的代碼。製作一組您想要驗證的字段。在該陣列上運行循環,標記字段truefalse。找出是否所有的字段都是真的。

$validate = array_fill_keys(array('firstname', 'lastname', ...), null); 

foreach ($validate as $field => &$valid) { 
    // your validation logic here! 
    $valid = !empty($_POST[$field]) ? $_POST[$field] : false; 
} 

if (array_filter($validate, function ($i) { return $i === false; })) { 
    die('Some fields are invalid!'); 
} 

這是一個簡單的骨架。您可以擴展此設置,以便爲陣列中的失敗字段設置單獨的錯誤消息,個人驗證規則等。

+0

有趣,謝謝。我看到你已經寫了一篇關於isset正確使用的非常好的帖子,並沒有鏈接到它。推薦閱讀其他人:http://kunststube.net/isset –