PHP注册表单验证


PHP signup form validation

我在提交时有一个简单的表单,它将被重定向到submit.php,如果出现错误,它将在submit.php上显示错误消息。现在我想要的是,错误消息将显示回表单页面。

<html>
<head>
<? require_once('lib.php'); ?>
</head>
<body>
<form name="my-form" id="my-form" method="post" action="submit.php">
        Your name:
        <input name="name" value="" size="30" maxlength="255" />
        Your email:
        <input name="email" value="" size="30" maxlength="255" />
        Your favourite color:
            <select name="fav_color">
                <option value="">-select please-</option>
                <option value="Black">Black</option>
                <option value="White">White</option>
                <option value="Blue">Blue</option>
                <option value="Red">Red</option>
                <option value="Yellow">Yellow</option>
            </select>
        Your comment:
        <textarea name="comment" rows="6" cols="35"></textarea>
    <input type="submit" value="Submit" />         
</form>
</body>
</html>
<?php
require_once('lib.php');
function getErrors($postData,$rules){
  $errors = array();
  // validate each existing input
  foreach($postData as $name => $value){
    //if rule not found, skip loop iteration
    if(!isset($rules[$name])){
        continue;       
    }
    //convert special characters to HTML entities
    $fieldName = htmlspecialchars($name);
    $rule = $rules[$name];
    //check required values
    if(isset($rule['required']) && $rule['required'] && !$value){
        $errors[] = 'Field '.$fieldName.' is required.';
    }
    //check field's minimum length
    if(isset($rule['minlength']) && strlen($value) < $rule['minlength']){
         $errors[] = $fieldName.' should be at least '.$rule['minlength'].' characters length.';    
    }
    //verify email address     
    if(isset($rule['email']) && $rule['email'] && !filter_var($value,FILTER_VALIDATE_EMAIL)){
      $errors[] = $fieldName.' must be valid email address.';
    }
    $rules[$name]['found'] = true;
  }

  //check for missing inputs
  foreach($rules as $name => $values){
    if(!isset($values['found']) && isset($values['required']) && $values['required']){
      $errors[] = 'Field '.htmlspecialchars($name).' is required.';
    }
  }
  return $errors;
}
$errors = getErrors($_POST,$validation_rules);
if(!count($errors)){
  echo 'Your form has no errors.';
}
else{  
  echo '<strong>Errors found in form:</strong><ul><li>';
  echo join('</li><li>',$errors);
  echo '</li></ul><p>Correct your errors and try again.</p>';
}
?>

由于此php代码在同一页面上显示错误消息。我想在form.php page上显示错误消息。有人帮我这么做吗.

本文介绍了您的解决方案。

您应该创建一个验证器脚本(例如validate.php),并在那里提交表单进行验证。如果验证失败,验证器脚本应该返回一个验证错误数组(JSON、XML,无论您想要什么)。否则-返回重定向链接。

因此,当您在表单上单击"提交"时,应该向validator.php发出AJAX请求,而不是重定向。

你应该考虑使用一个框架来解决这些问题。这将节省大量的编码时间。

一个简单的解决方案是将您的注册页面作为表单操作,并用包装php代码

if(isset($_POST['submit'])){
    //php code here
}

然后,您可以复制php代码并将其粘贴在html页面的开头。然后将表单操作设置为页面。

如果你想在处理PHP代码时隐藏部分表单,你可以这样做::

echo '<style>.style1 {display: none }</style>";

或者您甚至可以在注册后以相同的形式向用户显示自定义消息:

echo '<div class="highlight"><p class="textcenter"><h5>You have successfully registered for blah blah blah.</h5></p><p>Thank you!</p><style>.style1 {display: none }</style>";

注意,我假设body标记的其余部分是具有类stlye1的样式。

这也确保了当用户提交表单时,只加载html页面中所需的文本,即可见文本

正如Sergey Eremin所指出的,为这类任务考虑一个框架是很好的。

无论如何,以下是我在PHP中的操作方法。所有的代码都包含在一个页面(submit.php)中。因此,表单提交给自己。当用户打开submit.php时,会显示表单。当他们点击提交时,程序会检查是否提供了姓名、有效的电子邮件、喜欢的颜色和评论。如果没有一个是空的,并且电子邮件是有效的,程序会显示"一切正常"。否则,它会将用户重定向回表单,并指向未正确填写的字段。用户以前提供的每一个数据都通过重定向URL传递。使用$_GET,它会被检索并显示在表单中,因此用户不需要从头开始重新键入所有内容。

在插入数据库之前,请不要忘记清理/转义数据。

希望这能有所帮助。

<?php 
    //if the form has been submitted
    if (isset($_POST['submit'])){
        //extract data submitted through the form and assign date to variables
        $name = $_POST['name'];
        $email = $_POST['email'];
        $favoriteColor = $_POST['fav_color'];
        $comment = $_POST['comment'];
        //pattern against which to check email validity
        $good_email = "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+'.[A-Za-z]{2,4}";
        //if provided data is valid (email especially) and no form field has been left empty display "everything is okay" 
        if(strlen($name) > 0 && strlen($email) > 0 && preg_match("/$good_email/", $email, $regs) && strlen($favoriteColor) > 0 && strlen($comment) > 0){
            echo "Everything is okay";
        }
        //otherwise redirect the user back to the form and indicate errors that they need to correct
        else{
            //build an error message string where the user is shown where the issue is
            $error_message = "There are errors with your form."; //starting point for the error message 
            //if message has been left empty let the user know that the name is required
            if(strlen($name) == 0){
                $error_message .= "<br/>Name is required";
            }
            //if the email is left empty let the user know that an email is required 
            if(strlen($email) == 0){
                $error_message .= "<br/>Email is required";
            }
            //if the email does not match the pattern ($good_email) let the user know that the email they have supplied is invalid 
            if(!(preg_match("/$good_email/", $email, $regs))){
                $error_message .= "<br/>Email is not valid";
            }
            //if the a favorite color has not been selected let the user know that they need to select a favorite color
            if(strlen($favoriteColor) == 0){
                $error_message .= "<br/>Favorite color can not be left empty";
            }
            //if the comment is left empty let the user know that comment is required
            if(strlen($comment) == 0){
                $error_message .= "<br/>Comment is required";
            }
            //if any field is left empty or the email is invalid redirect the user back to the form along with the data they submitted 
            header("Location: submit.php?&submittedName=$name&error=$error_message&submittedEmail=$email&submittedColor=$favoriteColor&submittedComment=$comment");
        }
    }
    //if no submission display the form
    else{
?>
<html>
<head>
</head>
<body>
<?php
    //display the error message 
    //error message is passed through the url
    if (isset($_GET['error']))
    {
        echo "<p style='color:red'>".$_GET['error']."</a>";
    }
?>
<form name="my-form" id="my-form" method="post" action="submit.php">
        Your name:
        <input name="name" value="<?php if($_GET['error']) { echo $_GET['submittedName'];} //if there's been an error with form submission display the name the user prevously submitted ?>" size="30" maxlength="255" />
        Your email:
        <input name="email" value="<?php if($_GET['error']) { echo $_GET['submittedEmail'];} //if there's been an error with form submission display the email the user prevously submitted ?>" size="30" maxlength="255" />
        Your favorite color:
            <select name="fav_color">
                <option value="">-select please-</option>
                <option value="Black">Black</option>
                <option value="White">White</option>
                <option value="Blue">Blue</option>
                <option value="Red">Red</option>
                <option value="Yellow">Yellow</option>
            </select>
        Your comment:
        <textarea name="comment" rows="6" cols="35"><?php if($_GET['error']) { echo $_GET['submittedComment'];} //if there's been an error with form submission display the comment the user prevously submitted ?></textarea>
    <input type="submit" value="Submit" name="submit"/>         
</form>
</body>
</html>
<?php
}
?>