0

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

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

4

5 回答 5

3

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

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

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

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

于 2013-01-09T15:26:19.357 回答
1

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

于 2013-01-09T15:16:47.857 回答
1

快速浏览一下试试这个

会话方式

session_start();确保通过在 saveComment 所在的文件顶部执行并检查 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']);
    }

我没有对此进行测试,但您应该了解该做什么的基本概念。

于 2013-01-09T15:31:03.383 回答
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>
于 2013-01-09T15:31:44.163 回答
0

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

有两种方法可以做到这一点,要么将其传递给查询字符串(因此添加 &error=...)并在模板中解析它,要么将其保存到会话中。

当然,您确实应该在使用不同的方式呈现您的模板之前执行此操作,但这是对您的代码的完全修改。

于 2013-01-09T15:17:31.057 回答