传递php表单验证错误消息返回提交表单

时间:2013-01-09 15:14:22

标签: php

我正在尝试将函数中服务器端表单验证程序的错误消息传递回它提交的表单。验证程序正在运行,因为它可以防止其余代码按计划将其保存到数据库中。但是我无法将其传回表单以显示错误

function saveComment(){
    $validate = array();
    $id = isset($_POST["articleId"]) ? $_POST["articleId"] : '';

    if ( isset( $_POST['saveChanges'] ) ) {

    if ( $_POST['name'] == "" ){
         $validate['errorMessage'] = "Please fill out your name.";
      header( "Location:".HOME_PATH."/.?action=viewArticle&articleId=".$_POST['articleID']."");
    }

我想把它传回给这个

if ( isset( $validate['errorMessage'] ) ) {
    echo $validate['errorMessage'];
} 

当我删除显示功能上的if时,我收到错误unidentified index

我需要做什么才能让表单显示错误消息。我是否需要将数组传递给处理文章显示的函数?

反馈

对于任何可能发现这个有用的人,我使用@OliverBS post方法几乎没有改变。

还要感谢@ lethal-guitar,因为他的解释帮助我理解了我哪里出错了以及可以用来解决这个问题的各种方法+1

5 个答案:

答案 0 :(得分:3)

您正在为当前正在执行的脚本设置变量$validate。然后,您发送重定向标头。这将导致浏览器发出新请求,从而结束当前正在执行的脚本并删除变量。新请求将触发另一个脚本调用,其中该变量不再被知道,因为它仅在第一个请求的持续时间内存在。

HTTP是无状态的,因此您在服务器端设置的每个变量只有在您完成当前请求并响应客户端之后才会存在。您需要的是一种将此变量传递给处理第二个请求的脚本的方法。有几种方法可以这样做:

  • 传递GET参数。您可以将"&validationError=" . $validate['errorMessage']之类的内容附加到您传递到Location标头的网址,然后在显示页面中通过$_GET访问它。
  • 将验证状态保存在$_SESSION中。 PHP手册包含很多关于会话的信息(也许你已经在使用它们了?)
  • 重构您的代码的方式是您不会在出错时重定向,但会成功。

关于第三个提案的更多信息:您编写一个PHP脚本,显示表单处理表单发布请求。如果验证失败,您只需重新显示,然后插入已有的echo语句。如果它成功,您将重定向到某个成功页面。这样,变量将保持可访问状态,因为它仍然是相同的请求。

答案 1 :(得分:1)

当您执行标题位置时,您会将用户重定向到新页面。您将不得不在查询字符串中传递错误,或者理想情况下将其作为会话中的变量传递。

答案 2 :(得分:1)

快速浏览一遍

会话方式

确保通过在saveComment所在的文件顶部执行session_start();并检查isset来启动会话。

function saveComment(){

    $id = isset($_POST["articleId"]) ? $_POST["articleId"] : '';

    if ( isset( $_POST['saveChanges'] ) ) {

    if ( $_POST['name'] == "" ){
         $_SESSION['errorMessage'] = "Please fill out your name.";
         header( "Location:".HOME_PATH."/.?action=viewArticle&articleId=".$_POST['articleID']."");
    }

if ( isset( $_SESSION['errorMessage'] ) ) {
    echo $_SESSION['errorMessage'];
}

或者你可以尝试

发布方式

function saveComment(){

        $id = isset($_POST["articleId"]) ? $_POST["articleId"] : '';

        if ( isset( $_POST['saveChanges'] ) ) {

        if ( $_POST['name'] == "" ){
             $error = urlencode('Please fill out your name');
             header( "Location:".HOME_PATH."/.?action=viewArticle&articleId=".$_POST['articleID']. "&error=" . $error);
        }

    if ( isset( $_GET['error'] ) ) {
        echo urldecode($_GET['error']);
    }

我没有对此进行过测试,但您应该了解该怎么做。

答案 3 :(得分:1)

我建议在一个文件中执行此操作,即将表单和验证作为一个文件。

然后你可以这样做:

<?php
    //set success to 0
    $success = 0;
    $errormsgs = array();

    //check for post
    if(isset($_POST['submit'])){

        //get the data from the form post and validate it
        $valid = validateFuntion($_POST['data'])
            //the is function will validate the data. If it is not valid, it will add a message to $errormsgs

        //check for errors
        if(!$errormsgs){
            //data validation was successful, do stuff

        }
    }//if validation fails, it will fall out of the this code block and move on
?>


<html>
<body>
<?php
//check for errors
if($errormsgs){
    $content .= '<ul class="errors">';
                    foreach($errormsgs as $error){
                        $content .= "<li>" . $error . "</li>";  
                    }
    $content .= "</ul>";
    echo $content;
}
?>
<form name="name" action="" method="post">
    <input name="name" value="<?= (isset($_POST['data']) ? $_POST['data'] : '') ?>" type="text">
</form>
</body>
</html>

答案 4 :(得分:0)

您正在使用header语句将用户重定向到“错误”页面。问题是,当然,这是一个全新的页面,没有剩下的状态,所以你的变量都不存在了。

有两种方法可以执行此操作,或者将其传递给查询字符串(因此添加&amp; error = ...)并在模板中解析,或将其保存到会话中。

当然,在使用不同的方法呈现模板之前,您应该真的这样做,但这是对代码的完整返工。