我有一个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' ) ;
}
?>