如何显示';成功';表单上的消息在不更改URL的情况下提交


How to show 'success' message on form submit without changing URL?

我有一个PHP网站(带有CodeIgniter),其中包括一个注册表单。表单发布到第三个URL,该URL进行处理,如果成功,则重定向回第一个页面(如果不成功,则返回表单页面)。

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

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

有三种方法可以实现

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

如果您选择使用SESSION,您可以将会话变量分配给真正的

$_SESSION['registered'] = true; 

并在第一页上检查

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

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

来自CI会话文档:

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

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

添加flash数据:

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

您还可以将数组传递给set_flashdata(),方法与set_userdata()。

读取flash数据变量:

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

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

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

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

此外,这可以通过AJAX进行处理,但这将是在表单处理页面

中进行正确验证的第二步

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中显示变量。

这里有几个解决方案,其中一个是检查表单提交情况,如果还没有提交,则重定向到带有表单的页面。

即:

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