5

我在提交时有这个简单的表单,它会被重定向到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. 有没有人帮我这样做..

4

3 回答 3

3

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

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

因此,当您在表单上单击“提交”时,应该会发生对 validator.php 的 AJAX 请求,而不是重定向。

您应该考虑使用框架来解决此类问题。这将节省大量的编码时间。

于 2012-07-19T19:19:21.790 回答
1

一个简单的解决方案是将您的注册页面作为您的表单操作,并将 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 标签的其余部分是带有 class 的样式stlye1

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

于 2012-07-19T19:55:36.633 回答
0

正如 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
}
?>
于 2015-01-30T18:43:02.927 回答