2014-10-21 90 views
-1

我是PHP的新手,但是我想要的是如果出現錯誤,頁面將自我處理(contact.php),但如果它通過,則轉到另一個PHP頁面(contactconfirm.php)驗證。有人能告訴我這段代碼有什麼問題嗎?表單動作的三元運算符

if(isset($_POST['submit'])){ 
    if(empty($name)) { 
     $errors ++ ; 
     echo "<p>You did not enter a name.</p>";  
    } else { 
     $errors = 0; 
    } 
    if(empty($email)) { 
     $errors ++ ; 
     echo "<p>You did not enter an e-mail.</p>";  
    } else { 
     $cleanEmail = filter_var($email, FILTER_SANITIZE_EMAIL); 
     if (!filter_var($cleanEmail, FILTER_VALIDATE_EMAIL)){ 
      $errors ++; 
      echo "<p>Invalid e-mail. Please try again.</p>"; 
     } else { 
      $errors = 0; 
     } 
    } 
} //closes isset 

?> 


<div class="contact-form"> 
<div class="inputArea"> 
<form action="<?php echo ($errors > 0) ? 'contact.php' : 'contactconfirm.php' ?>" method="post"> 
+0

我在代碼中看不到任何重定向。 – 2014-10-21 21:31:39

+0

什麼不按預期工作? – baao 2014-10-21 21:31:58

回答

1

你傳遞一個驗證階段時,都會重置$errors0

例如

check if "foo" is correct: nope, increments $errors -> `1` 
check if "bar" is correct: yep, reset $errors to 0 

if ($errors == 0) 
    everything is perfect! happy joy joy! 
} 

但哎呀,「富」是錯誤的,現在你說一切正常,因爲你的錯誤計數器被重置。只需從驗證/驗證階段中刪除所有中的$errors = 0即可。

0

請參閱Marc B的回答指出第一個最初的問題。

您在每次檢查的其他位置重置$ errors = 0。您必須刪除這些語句,否則如果稍後的檢查語句有效,$ errors變量將被重置。

此外,在檢查過程中不打印錯誤,而是追加到錯誤數組,並在發生所有錯誤檢查後檢查錯誤變量會好得多。

例如

if($errors>0){ 
    print_r($errorArray); 
} 

if($errors>0){ 
    foreach($errorArray as $error){ 
    echo $error; 
    } 
} 

而且,沒有你的代碼的其餘部分尚不清楚,但它似乎是上半部分被重定向到這個頁面後驗證,但將永遠不會發生,因爲您首先會自動將表單操作設置爲contactconfirm.php,因爲在第一次加載頁面時$錯誤不會有值。不過,我可能會誤解你的代碼而沒有完整的頁面。

您應該考慮移除表單中的轉折操作符,並始終使用contact.php

然後,您可以使用條件邏輯來檢查是否沒有錯誤,如果沒有,使用header("Location: contactconfirm.php")重定向。有關更多信息,請參閱此documentation on header