2014-10-21 54 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