2015-02-23 70 views
0

我做的提交表單,多數民衆贊成的PHP檢查,我想向用戶展示他們忘記填寫所有字段的PHP檢查所有空的輸入列表。我也在使用jQuery,但用戶可以禁用它,而且您確實需要服務器端檢查表單。如何顯示對形式

的事情是,如果有6個必填字段,他們提交的形式與他們的2個空,代碼只顯示第一位的,之後便再次提交,它會顯示他們的第二個。你會建議做什麼?

下面是代碼:

if (isset($_POST['submit'])){ 

     $message = ""; 

     if (trim($_POST['ign'])){ 
      if (trim($_POST['god'])){ 
       if (trim($_POST['replay_id'])){ 
        if (trim($_POST['map_type'])){ 
         if (trim($_POST['time_min']) AND trim($_POST['time_sec'])){ 
          if (trim($_POST['description'])){ 
           // Submit the form 
          }else{ 
           $message .= "<li>Description is empty</li>"; 
          } 
         }else{ 
          $message .= "<li>Time not specified</li>"; 
         } 
        }else{ 
         $message .= "<li>Match type not specified.</li>"; 
        } 
       }else{ 
        $message .= "<li>Replay ID not specified.</li>"; 
       } 
      }else{ 
       $message .= "<li>God was not specified.</li>"; 
      } 
     }else{ 
      $message .= "<li>In game name was not specified!</li>"; 
     } 


     if (!empty($message)){ 
      $message = "<div style='text-align:left; display: inline-block;'><ul>".$message."</ul></div>"; 
     }else{ 
      $message = "Submit succesfull"; 
     } 

     echo "<div id='close-message'><div class='admin-message'>$message</div></div>"; 
    } 

這樣做的,我能想到的,如果這個代碼的唯一的其他方式:

if (isset($_POST['submit'])){ 

    $message = ""; 
    $pass = TRUE; 

    if (!trim($_POST['ign'])){   $message .= "<li>In game name was not specified!</li>"; $pass = FALSE; } 
    if (!trim($_POST['god'])){   $message .= "<li>God was not specified.</li>";   $pass = FALSE; } 
    if (!trim($_POST['replay_id'])){ $message .= "<li>Replay ID not specified.</li>";  $pass = FALSE; } 
    if (!trim($_POST['map_type'])){  $message .= "<li>Match type not specified.</li>";  $pass = FALSE; } 
    if (!trim($_POST['description'])){ $message .= "<li>Description is empty</li>";   $pass = FALSE; } 
    if (!trim($_POST['time_min']) AND trim($_POST['time_sec'])){ $message .= "<li>Time not specified</li>"; $pass = FALSE; } 

    if ($pass){ 
     $message = "Submit succesfull"; 
     // Submit the form 
    }else{ 
     $message = "<div style='text-align:left; display: inline-block;'><ul>".$message."</ul></div>"; 
    } 

    echo "<div id='close-message'><div class='admin-message'>$message</div></div>"; 
} 

是否有其他辦法做到這一點?同樣,純粹的PHP,jQuery在那裏,但它可以被禁用,HTML5也不適用於所有瀏覽器。

謝謝。

回答

1

如果你追求是擺脫所有if聲明,並使您的代碼更乾淨,這可能是一個可能的解決方案:

設置一個數組,其中包含必需的字段及其相應的「必需」錯誤消息。循環通過陣列和匹配字段針對$_POST察覺這是沒有設置任何所需的字段,加入任何此類字段的錯誤消息發送到所述$errors陣列。

發現的所有錯誤將被顯示爲一個無序列表。如果沒有錯誤,則會顯示成功消息。

// Set some values for the example 
$_POST['submit'] = '1'; 
$_POST['ign'] = 'foo'; 
$_POST['god'] = 'bar'; 
$_POST['description'] = 'baz'; 

// Validate required fields if submitted 
if (isset($_POST['submit'])) { 
    $required = array(
     'ign'   => 'In game name was not specified!', 
     'god'   => 'God was not specified', 
     'replay_id' => 'Replay ID not specified', 
     'map_type' => 'Match type not specified', 
     'description' => 'Description is empty', 
     'time_min' => 'Time not specified', 
     'time_sec' => 'Time not specified', 
    ); 
    $errors = array(); 

    foreach ($required as $field => $errorMessage) { 
     if (isset($_POST[$field]) && trim($_POST[$field]) != '') { 
      continue; // All is well, check next required field 
     } 

     // No value was set for this required field 
     $errors[] = $errorMessage; 
    } 

    if ($errors) { 
     // Show any errors (use array_unique() to avoid duplicate error messages 
     // on time_min/time_sec fields) 
     $message = "" 
      . "<div style='text-align:left; display: inline-block;'>" 
      .  "<ul>" 
      .   "<li>" 
      .    implode('</li><li>', array_unique($errors)) 
      .   "</li>" 
      .  "</ul>" 
      . "</div>"; 
    } 
    else { 
     // All is well 
     $message = "Submit successful"; 
    } 

    echo "" 
     . "<div id='close-message'>" 
     .  "<div class='admin-message'>$message</div>" 
     . "</div>"; 
} 

輸出(縮進來提高可讀性):

<div id='close-message'> 
    <div class='admin-message'> 
     <div style='text-align:left; display: inline-block;'> 
      <ul> 
       <li>Replay ID not specified</li> 
       <li>Match type not specified</li> 
       <li>Time not specified</li> 
      </ul> 
     </div> 
    </div> 
</div> 
+0

等什麼?此代碼如何將錯誤消息添加到錯誤列表中?或者繼續實際上意味着,它會忽略其餘的代碼,並立即開始在數組中的新項目?此外,Isnt循環比在我的第二個代碼中使用這些ifs更具資源要求? Thanyway,謝謝你的迴應,我沒有想到陣列。 – MiChAeLoKGB 2015-02-23 20:58:19

+0

是的,這是'繼續'如何工作。至於你的其他問題,我會說,在處理這種代碼時,循環和重複if語句之間的納秒性能差異是不成問題的。可讀性,可維護性和清晰的結構更重要。 – mhall 2015-02-23 21:17:06

+0

啊,我其實從來沒有使用過繼續,所以從來沒有打擾到它究竟發生了什麼:D另外,這是真的,所以病態可能使用數組:)謝謝。 – MiChAeLoKGB 2015-02-23 21:29:55

1

我寧願把我的錯誤消息旁邊導致錯誤的領域和運行基於陣列上的整個事情保持代碼的DRY:

if (isset($_POST['submit'])){ 

    $fields = array(
     'ign' => 'In game name was not specified!', 
     'god' => 'God was not specified.', 
     ... 
    ); 
    $message = ""; 
    $error = array(); 
    $pass = TRUE; 

    foreach ($fields as $fld => $errmsg) { 
     if (!trim($_POST[$fld])) { 
      $message .= "<li>$errmsg</li>"; 
      $error[$fld] = $errmsg; 
      $pass = FALSE; 
     } 
    } 

我離開你$message變量在那裏,因爲它可能會讓用戶很好地在表單頂部和任何錯誤字段旁邊獲取消息。通常我會說「您的表單提交有錯誤 - 請參閱下文」。

然後在你的形式顯示代碼顯示的$error[$fld]值適當地向下。 (我假設你是再次顯示形式,讓廣大用戶解決他們並沒有在第一時間滿山遍野。)

所以之前你表單可能是這個樣子的(如果你使用的是表):

<table> 
    <tr> 
    <td align="right">In Game Name:</td> 
    <td><input name='ign' type='text' /></td> 
    </tr> 
    ... 

,現在它看起來就像這樣:

<table> 
    <tr> 
    <td align="right">In Game Name:</td> 
    <td><input name='ign' type='text' /></td> 
    <td><?= @$error['ign'] ?></td> 
    </tr> 
    ... 

隨着工作非常點點,你可以風格你的字段標籤用一種顏色來吸引用戶的關注和等

當然,如果你的表格是簡單的,那麼你可以有另一個陣列(或延伸超過$ fields數組的),這將再次做這一切爲你在一個簡單的循環:

$fields = array(
    'ign' => array('label' => 'In Game Name:', 'error' => 'In game name was not specified!'), 
    'god' => array('label' => 'God Mode:', 'error' => 'God was not specified.'), 
    ... 
); 
+0

我實際上是把紅色的邊框是空的所有字段/包含,而不是把下一另一個錯誤信息給他們的錯誤,因爲形式和整個頁面必須有響應,所以我不能承擔它太寬。但那實際上是相當不錯的答案。 – MiChAeLoKGB 2015-02-23 21:32:43