使用PHP来请求错误信息并在错误发生时发布

时间:2010-07-16 14:28:40

标签: php validation forms

我有一个HTML表单,它接收输入的数据并通过mail()函数发送。我也有一些验证输入的验证技术,我创建了一个数组变量$ errors来记录所有错误;例如,

如果名称留空,则$ errors [] =“名称为空”; 如果电子邮件留空,则$ errors [] =“email empty”;

依旧......

我能够使用以下技术报告错误:

print '<div id="formfeedback"><h3>Error!</h3><p>The following error(s) has occurred:<br />';
    foreach ($errors as $msg) { //prints each error
            print " - $msg<br />\n";
        } // end of foreach

然而,我想要的是以下内容。我希望将页面重定向回用于输入信息的原始表单(我知道确切的链接位置,因此我可以使用标题()或甚至<meta=http-equiv=refresh>将我带回表单页。

另外,在表单上,​​我希望能够在某个div中将表单上方的错误发布(称为div = errors)

我可以执行以下操作吗?

    <div id="errors">
<?php    
print 'The following error(s) has occurred:<br />';
            foreach ($_REQUEST[$errors] as $msg) { //prints each error
                    print " - $msg<br />\n";
                } // end of foreach
?>   
 </div>

非常感谢!

阿米特

4 个答案:

答案 0 :(得分:1)

最简单的方法是:

// Start the session
session_start();

// Store the errors in the session
$_SESSION['errors'] = $errors;

// Redirect to correct page
header('HTTP/1.1 303 See Other');
header('Location: http://original/page');
exit;

然后,在表单页面上:

// Start the session
session_start();

// extract the errors
$errors = isset($_SESSION['errors']) ? $_SESSION['errors'] : array();

// Display the form with errors
foreach ($errors as $msg) ... ;

答案 1 :(得分:1)

我同意@Fosco。我想再解释一下 -

可能有两宗个案─ 你正在做原始的PHP 2.您正在编写CI或您自己的任何php框架。

这将有助于识别错误字段并更改样式以更好地响应用户。最后的输入数据也保持不变。

  1. 你正在做原始的PHP 在这种情况下,您可以在同一文件/页面中接收输入数据。 我稍后会做一个常见的例子。

  2. 您正在编写CI或您自己的任何php框架。 在这种情况下,您加载一个视图文件以显示表单页面,并且您可以在加载时将数据传递到查看页面/文件。

  3. 对于上述两种情况,您可以进行一些编码,如 -

    /* 
    your input validation and verification goes here. where $error is generated too
    In addition add some error status in above section, 
    you can do it in your $error array too. Also you store received data into $data here. index of $data should be similar as (corresponding) HTML input name. 
    You can do it like below
    */
    $error_stat = array();
    //if the input field name is "email" and email input data raises any error then
    
    $error_stat['email'] = true;
    // same for name
    $error_stat['name'] = true;
    // and so on
    
    // now decide whether you will back to the form page or send the email and do other tasks
    if(count($error_stat)<= 0){
      // send email
      // do aditional tasks
    }
    else{
      // load the form again if its aframework or the form is in seperate file
      // off course send $error,$data and $error_stat to the form page/file
    }
    
    // now here is a code segment of form page
    <?php if(isset($error) && count($error)>0):?>
    <div id="error-msg">
    <?php
    //display errors here
    ?>
    </div>
    <?php endif;?>
    
    <form .... >
    <input type="text" name="email" class="<?php echo (isset($error_stat['email'])?'error':'else'); ?>" value="<?php echo $data['email'];?>" />\
    <!-- and so on ... -->
    

答案 2 :(得分:0)

通常我会使用相同的页面来处理输入和提交。如果数据有效,邮件将被发送,页面将通知他们(或将其重定向到其他地方)...如果数据无效,那么表单将再次出现并且错误可以显示,而不会花哨的重定向。

答案 3 :(得分:0)

确保您的会话在应用程序的顶部启动

包括这个基础课程

class FormErrors
{
    var $handler;
    function __construct($fname)
    {
        $this->handler &= isset($_SESSION[$fname]) $_SESSION[$fname] : ($_SESSION[$fname] = array());
    }

    public function add($name, $value)
    {
        $this->handler[$name] = $value;
    }

    public function remove($name)
    {
        unset($this->handler[$name]);
    }

    public function getErrors()
    {
        return $this->handler;
    }
}

所以当你处理错误时,你可以去

if(isset($_POST))
{
    $FormErrors = new FormErrors("registration");

    if(strlen($_POST['username']) == 0)
    {
       $FormErrors->add('Username','Please enter a valid username');
    }

    //And for the rest of your checks
}

然后在你的html内侧

foreach($FormErrors ->getErrors() as $name => $error)
{
    echo sprintf("<p title=\"%s\">%s</p>",$name,$error);
}

应该可行,如果你想删除所有已知的错误,

$FormErrors = new FormErrors("registration");
unset($FormErrors->handler,$FormErrors);