【问题标题】:How to show 'success' message on form submit without changing URL?如何在不更改 URL 的情况下在表单提交上显示“成功”消息?
【发布时间】:2012-02-15 16:46:29
【问题描述】:

我有一个包含注册表单的 PHP 站点(使用 CodeIgniter)。我有一个包含一些详细信息的页面,该页面链接到单独页面上的表单。表单发布到第三个 URL,该 URL 进行处理,如果成功则重定向回第一页(如果不成功,则重定向回表单页面)。

目前我正在为成功添加一个参数:example.com/page?success=1,它显示一条成功消息。问题是有些人一直在分享这个 URL(并单击 Facebook Like 按钮),所以当另一个用户打开该 URL 时,他们会看到一条消息“感谢注册!”他们显然还没有这样做。

我认为这是处理表单的标准方式(提交到一个 URL 并重定向到另一个),但有没有更好的方法?我不想发回同一页面,因为在尝试重新加载页面时会收到 POSTDATA 警告。

【问题讨论】:

标签: php forms codeigniter post


【解决方案1】:

你有三种方法可以做到这一点

  • 您的使用方式
  • 实际上不是重定向,而是使用 AJAX 发送请求
  • SESSION(或者,在极端情况下,cookie)

如果选择使用 SESSION,则只需将会话变量赋值为 true

$_SESSION['registered'] = true; 

并在第一页查看

if (isset($_SESSION['registered'])) { 
      unset($_SESSION['registered']); 
      // shot the message
}

【讨论】:

    【解决方案2】:

    通常,您会在会话中设置成功标志,以便在下一页加载时显示此消息。这通常称为 Flash 消息。然后,您将检查此会话标志的值/存在并相应地显示您的消息。在大多数框架中,都为此内置了功能,其中包括在下一个请求时清除标志,以便消息仅在执行生成它的操作后直接显示。

    来自 CI Sessions Documentation

    CodeIgniter 支持“flashdata”或会话数据 可用于下一个服务器请求,然后自动 清除。这些可能非常有用,通常用于 信息或状态消息(例如:“记录 2 已删除”)。

    注意:Flash 变量以“flash_”开头,因此请避免使用此前缀 在您自己的会话名称中。

    添加闪存数据:

    $this->session->set_flashdata('item', 'value');
    

    您也可以将数组传递给 set_flashdata(),方式与 set_userdata().

    读取 flashdata 变量:

    $this->session->flashdata('item');
    

    如果您发现需要通过 额外的请求,您可以使用 keep_flashdata() 函数来完成。

    $this->session->keep_flashdata('item');
    

    【讨论】:

      【解决方案3】:

      您应该在处理表单数据的代码中进行一些验证检查,以确保填写了必填字段。否则,您应该重定向到您的第一页让用户填写表单。

      此外,这可以通过 AJAX 处理,但这将是在表单处理页面中进行正确验证的第二步

      【讨论】:

        【解决方案4】:

        HTML:

         <form method="post">
             <input type="text">
             <input name="submitted" type="submit">
         </form>
        

        PHP:

        if($_POST['submitted']{
            //post was submitted process it
        
            if(/*whatever you're doing to the form succeeds*/){
                //show success
            }
        }
        

        POST 不会在 URL 中显示变量。

        【讨论】:

        • 我想知道同样的信息,以便我可以学习 - 我怀疑阅读上述答案是 Codeigniter 的一些怪癖。
        • @ChrisSobolewski 因为它没有远程回答问题。问题不在于如何读取 postdata。
        • 问题似乎是关于如何在没有 $_GET 变量包含 URL 的情况下提交表单。切换到 GET 是一个有效的解决方案,而且可能是最简单的。
        • @ChrisSobolewski 我在问题中也说过,“我不想回发到同一页面,因为在尝试重新加载页面时会收到 POSTDATA 警告。”
        【解决方案5】:

        这里有几种解决方案,一种是检查表单提交,如果尚未提交,则重定向到上面有表单的页面。

        即:

        <?php
         if (isset($_POST['submit']))
            {
            // process the form
            }
        else
            {
            //redirect to the form itself
            header( 'Location: http://www.yourform.com' ) ;
            }
        ?>
        

        【讨论】:

          猜你喜欢
          • 2011-07-09
          • 2016-10-11
          • 1970-01-01
          • 1970-01-01
          • 2016-03-19
          • 1970-01-01
          • 1970-01-01
          • 2015-10-16
          • 1970-01-01
          相关资源
          最近更新 更多