2011-10-26 43 views
1

我有一個使用形式發送以下數據page1.php中:PHP:檢查POST數據的理智方式?

<form action="page2.php" method="post"> 
<input type="text" name="f1"> 
<input type="text" name="f2"> 
<input type="text" name="f3"> 
<input type="text" name="f4"> 
<input type="submit" value="submit"> 
</form> 

在使page2.php,我做了一些基本的驗證,以便看到形式實際提交併已輸入的所有數據:

<?php 
if($_SERVER['REQUEST_METHOD'] != "POST" || empty($_POST["f1"]) || empty($_POST["f2"]) || empty($_POST["f3"]) || empty($_POST["f4"])) 
{ 
    $missing_input = array(); 

    if (empty($_POST["f1"])) 
    { 
     $missing_input[] = "field1"; 
    } 
    if (empty($_POST["f2"])) 
    { 
     $missing_input[] = "field2"; 
    } 
    if (empty($_POST["f3"])) 
    { 
     $missing_input[] = "field3"; 
    } 
    if (empty($_POST["f4"])) 
    { 
     $missing_input[] = "field4"; 
    } 

    die("Error: " . implode(", ", $missing_input)"); 
} 
?> 

的問題是,當一個新的POST字段中page1.php中形式引入上述感覺很醜陋,需要重新工作。我怎樣才能更好地編寫這個表單驗證?

回答

1

存儲f1,f2等在一個數組中,並使用for語句遍歷數組。

實施例:

if($_SERVER['REQUEST_METHOD'] != "POST") 
    die("Error: Wrong method"); 
$fields = array("f1", "f2", "f3", "f4"); 
$field_names = array("field1", "field2", "field3", "field4"); 
$length = count($fields); 
$missing_input = array(); 
for($i = 0; $i < $length; $i++) 
    if(empty($_POST[$fields[$i]])) 
     $missing_input[] = $field_names[$i]; 
if(!empty($missing_input)) 
    die("Error: " . implode(", ", $missing_input)"); 

注:上述是未經測試。

+0

是的,這沒有把戲。只需要添加一個IF周圍的die()。此外,還移除了Col.Srapnel建議中的request_method檢查。 – BaUn

+0

固定以備將來參考。 – Dennis

1

你應該看看使用像zend或yii這樣的框架。簡單的答案是,如果你不喜歡這樣做,你將不得不編碼一個類或對象來做到這一點。

2

這適用於任意數量的字段,你把你的形式

if ($_SERVER['REQUEST_METHOD'] != "POST") { 
    die("Improper request method"); 
} 

if (!empty($_POST)) { 
    foreach ($_POST as $key => $field) { 
     if (strlen($field) === 0) { 
      $missing_input[] = $key; 
     } 
    } 
} 

if (!empty($missing_input)) { 
    die("Error: " . implode(", ", $missing_input)"); 
} 
+0

另外,特別是因爲你正在檢查$ _SERVER ['REQUEST_METHOD']!=「POST」,你應該確保使用$ _REQUEST而不是$ _POST – uncreative

+0

是的我不確定「request method!= post」是什麼在他的腳本中做..如果請求方法是GET,驗證將無法繼續。但是我確實在頂部添加了它。 –

+0

建議將if(!$ field){'改爲'if(strlen($ field)=== 0){'以避免與falsy表單後值衝突。 – James

2

您可以使用一個簡單的循環具有可變控股的字段名:上述

<?php 
if ($_SERVER['REQUEST_METHOD'] == "POST") 
{ 
    $fieldnames = array(
    'f1' => 'field1', 
    'f2' => 'field2' 
    'f3' => 'field3' 
    'f4' => 'field4' 
); 
    $missing_input = $array(); 
    foreach ($fieldnames as $code => $label) 
    { 
    if (empty($_POST[$code])) 
     { 
      $missing_input[] = $label; 
     } 
    } 

    //Display errors nicely 
    if (count($missing_input) > 0):?> 
    <p>The following fields are required :</p> 
    <ul> 
    <?php foreach ($missing_input as $field): ?> 
    <li><?php echo $field ?></li> 
    <?php endforeach; ?> 
    </ul> 
    <?php endif; 
} 
0

感覺非常難看

這是錯誤的感覺。
如果你只需要檢查字段是否爲空,你當然可以做一些愚蠢的循環。

在現實生活中,對不同的領域有不同的檢查,所以,你必須依次手動編寫所有的檢查。沒有什麼問題。

我在這裏看到的唯一問題是第一行中的冗餘檢查。爲什麼所有這些「||空」在那裏?

+0

With'$ _SERVER ['REQUEST_METHOD']!=「POST」'我試圖確保page2.php不被直接訪問,即用戶已經在page1.php上提交了表單。我使用各種'empty($ _ POST [「f1」])',這樣字段不會留空。 – BaUn

+0

@BaUn你沒有注意到你正在檢查它嗎? –

+0

爲什麼,你是對的,Col Shrapnel! – BaUn