如何解决表单验证的失败同步?

时间:2010-01-18 09:50:48

标签: php validation forms synchronize

我想知道是否有人可以帮助我的表格验证吗?

我在尝试同步脚本的实际结构的某些位如何协同工作时遇到了一些问题。

<?php
$flag="OK";   // This is the flag and we set it to OK
$msg="";        // Initializing the message to hold the error messages
   if(isset($_POST['Send'])){
      $key=substr($_SESSION['key'],0,4);
      $num_key = $_POST['num_key'];
      if($key!=num_key){
      $msg=$msg."Your Key not valid! Please try again!<BR>";
      $flag="NOTOK";
           }
      else{
    $msg=$msg."Your Key is valid!<BR>";
    $flag="OK";
        } 
         }
$email=$_POST['email'];
echo "Your Email: ".$email." is";
if (!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)){
$msg=$msg."Invalid email<BR>";
$flag="NOTOK"; 
}else{
$msg=$msg."Valid Email<BR>";
$flag="OK";
}
$password=$_POST['password'];
if(strlen($password) < 5 ){ 
$msg=$msg."( Please enter password of more than 5 character length  )<BR>";
$flag="NOTOK"; 
}
if($flag <>"OK"){
echo "$msg <br> <input type='button' value='Retry' onClick='history.go(-1)'>";
}else{ // all entries are correct and let us proceed with the database checking etc …
} 
function spamcheck($field)
  {
  $field=filter_var($field, FILTER_SANITIZE_EMAIL);
  if(filter_var($field, FILTER_VALIDATE_EMAIL))
    {
    return TRUE;
    }
  else
    {
    return FALSE;
    }
  }
if (isset($_POST['email']))
  {//if "email" is filled out, proceed
  $mailcheck = spamcheck($_POST['email']); 
  if ($mailcheck==FALSE)
    {
    echo "Invalid input";
    }
      }
?>

问题,当电子邮件有效,密码有效,虽然密钥无效,密钥警告消失,但也意味着传递...而且垃圾邮件检查看起来也不起作用..

2 个答案:

答案 0 :(得分:1)

您的每个测试都会将标记设置为“OK”或“NOTOK”覆盖先前测试所做的决定。
你可以从$ flag = true;开始。并且只有当测试确定输入不满意时才设置$ flag = false 或者你可以完全删除$ flag并在测试后检查0 === strlen($ msg)。

答案 1 :(得分:1)

您已经注意到,您不必将标记设置为“确定”或先前的错误被屏蔽。 如果所有检查都没问题,则该标志保持有效状态并且您可以传递,否则,如果其中一个检查失败,则该标志报告错误状态。

  $flag="OK";   // This is the flag and we set it to OK
  $msg="";        // Initializing the message to hold the error messages
  if(isset($_POST['Send'])) {
    $key=substr($_SESSION['key'],0,4);
    $num_key = $_POST['num_key'];
    if($key!=$num_key){
    $msg=$msg."Your Key not valid! Please try again!<BR>";
    $flag="NOTOK";
  } else {
    $msg=$msg."Your Key is valid!<BR>";
  } 
}

$email=$_POST['email'];
echo "Your Email: ".$email." is";
if (!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)){
$msg=$msg."Invalid email<BR>";
$flag="NOTOK"; 
}else{
  $msg=$msg."Valid Email<BR>";
}

$password=$_POST['password'];
if(strlen($password) < 5 ){ 
  $msg=$msg."( Please enter password of more than 5 character length  )<BR>";
  $flag="NOTOK"; 
}

if($flag <>"OK"){
  echo "$msg <br> <input type='button' value='Retry' onClick='history.go(-1)'>";
} else { 
  // all entries are correct and let us proceed with the database checking etc …
} 

说我会使用不同的方法,例如使用除名为flag的字符串之外的布尔值。您可以获得更流畅的代码,称之为$ inputIsvalid。

其他唠叨:有时你将消息添加到$ msg变量,其他你发出回声,也许这是一个疏忽。

还有很大的改进空间,正如其他所有代码一样,我将解决一些简单的问题,例如我不会检查是否设置了变量。

  $inputIsValid=true;   // This is the flag and we set it to OK
  $messages = array();        // Initializing the message to hold the error messages

  if(isset($_POST['Send'])) {
    $key=substr($_SESSION['key'],0,4);
    $num_key = $_POST['num_key'];
    if($key!=$num_key){
      $messages[]= 'Your Key not valid! Please try again!';
      $inputIsValid=false;
    } else {
      $messages[]'Your Key is valid!';
    } 
  }

  $email=$_POST['email'];
  $emailRegex='^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$';
  $emailIsValid = eregi($emailRegEx, $email);
  $messages[]= 'Your Email: '.$email.' is ' .($emailIsValid? 'Valid':'Invalid');
  $inputIsValid = $inputIsValid && emailIsValid;

  $password=$_POST['password'];
  if(strlen($password) < 5 ){ 
    $messages[]='( Please enter password of more than 5 character length  )';
    $inputIsValid=false; 
}

if(!inputIsValid){
  $messages[]='<input type='button' value='Retry' onClick='history.go(-1)'>';
  echo join('<br/>', $messages); 
} else { 
  // all entries are correct and let us proceed with the database checking etc …
} 

另一种方法应该是(函数非常简单,但您可以在不影响主代码的情况下修改不同组件的验证策略):

  function validateKey() {
    if(!isset($_POST['Send'])) {
      return true;
    }

    $key=substr($_SESSION['key'],0,4);
    $num_key = $_POST['num_key'];
    return $key==$num_key;
  }

  function validateEmail($email) {
    $emailRegex='^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$';
    return eregi($emailRegEx, $email);
  }

  function validatePassword($password) {
    return strlen($password) < 5;
  }

  $inputIsValid=true;   // This is the flag and we set it to OK
  $messages = array();        // Initializing the message to hold the error messages

  if(validateKey()) {
    $messages[]'Your Key is valid!';
  } else {
    $messages[]= 'Your Key not valid! Please try again!';
    $inputIsValid=false;
  }

  $emailIsValid = validateEmail($_POST['email']);
  $messages[]= 'Your Email: '.$email.' is ' .($emailIsValid? 'Valid':'Invalid');
  $inputIsValid = $inputIsValid && emailIsValid;

  $password=;
  if(!validatePassword($_POST['password']){ 
    $messages[]='( Please enter password of more than 5 character length  )';
    $inputIsValid=false; 
  }

if(!inputIsValid){
  $messages[]='<input type='button' value='Retry' onClick='history.go(-1)'>';
  echo join('<br/>', $messages); 
} else { 
  // all entries are correct and let us proceed with the database checking etc …
} 

垃圾邮件功能:

为什么你使用常数不同于boolena值? (TRUE与true不同,FALSE与false不同) 您可以像这样重写函数以获得所需的行为。

function spamcheck($field)
{
  $field=filter_var($field, FILTER_SANITIZE_EMAIL);
  return filter_var($field, FILTER_VALIDATE_EMAIL);
}

if (isset($_POST['email'])) {//if "email" is filled out, proceed
  $mailcheck = spamcheck($_POST['email']); 
  if (!$mailcheck) {
    echo "Invalid input";
  }
}