2013-01-09 117 views
0

我试图从服务器端表单验证器中的函数返回一个错误消息回到它提交的形式。验证器正在工作,因为它可以防止其余的该代码按照计划将其保存到数据库中。不过,我不能让它传回的形式来显示错误通过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方法几乎不变。

也谢谢你@致命的吉他,他的解释使我明白我哪里错了,可以用来解决这个问题+1

+4

@BogdanBurim如果你要费心评论使一些有用的东西不是一个毫无意义的声明 – user1711576

+0

嘿,这是否只是确保你写你怎样得到的去工作,这样别人就可以使用这个问题,你不会忘记将来。 –

回答

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']; 
} 

,或者你可以尝试我没有测试过这

POST方式

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']); 
    } 

,但你应该得到的东西做的基本理念。

1

当你做你的重定向头位置的各种方法用户转到新页面。您将不得不在查询字符串中传递错误,或理想地将其作为会话中的变量传递。

+0

或重构代码以重定向成功,而不是错误。 –

+0

在POST请求上,最好使用303重定向,无论结果如何。这可以防止用户刷新页面并意外重新提交表单或使用前进和后退浏览器按钮执行相同操作。 – tavocado

0

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

有两种方法可以将它传递给查询字符串(因此请添加&错误= ...)并将其解析到模板中,或将其保存到会话中。

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

3

您正在为当前正在执行的脚本设置变量$validate。之后,您发送重定向标头。这将导致您的浏览器发出新的请求,从而结束当前正在执行的脚本并取消变量。新的请求将触发另一个脚本调用,其中变量不再是已知的,因为它只在第一个请求期间存在。

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

  • 传递GET参数。您可以将类似"&validationError=" . $validate['errorMessage']的内容附加到您传递到位置标题的网址,然后在显示页面上通过$_GET进行访问。
  • 将验证状态保存在$_SESSION中。 PHP手册包含大量有关会话的信息(可能您已经在使用它们了?)
  • 重构代码的方式不会在错误时重定向,但会成功。

3号提案中的一些详细信息:你写一个PHP脚本,显示形式处理表单POST请求。如果验证失败,只需重新显示,然后插入您已有的语句echo。如果它成功,您将重定向到某个成功页面。这样,变量将保持可访问,因为它仍然是相同的请求。

+0

传递错误号的好处是可以缩短查询参数的长度。 –

+0

谢谢你的帮助。我现在已经明白了这个问题,并且为了将来的参考而对它进行处理 – user1711576

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>