我在page1.php
中有一个表单,指向page2.php
,page1.php
中表单中的数据插入到数据库中。成功插入后,page2.php
会显示一条消息,并提供转到第三页的链接。
问题是当插入后的用户点击浏览器的后退按钮并单击表单提交按钮时,再次插入。
有没有办法让按下后退按钮一次插入后会显示一条消息,表明不允许访问后退按钮?或者,如果允许在单击表单提交按钮时不会插入?
稍后编辑添加此部分:
好的,让我详细说说。这是一个管理员后端。管理员为不同的产品提供描述文本输入。他给出了page1.php的输入,并且在page2.php上显示了消息,说明已经插入到db中。然后信息下方还有另一个表格。它只是询问管理员是否希望用描述文本做更多的事情。如果是的话,那么点击表单提交按钮,他就会被带到一个页面,从那里,他再次被带到page1.php(这次是另一个产品),从那里到page2.php等等。顺便说一句,我可以使用普通页面链接,而不是page2.php
上的消息下面的表单按钮链接问题是,当管理员在page2.php上并点击后退按钮时,他会回到page1.php,如果他点击表单提交按钮,那么数据会在第二次插入新行。
你可能建议在'INSERT'命令中使用'IGNORE',但是行中还有其他列可能与另一列的列不匹配,而描述列(admin插入此列的文本数据)可能会得到匹配。
1)在这种情况下是否适用?
2)如果网站数据库允许重复输入,应该是什么解决方案?
谢谢
希望它能让事情变得清晰。
答案 0 :(得分:5)
不是将链接提供给第三页,而是重定向到相同的URI
这是一个非常方便的方法POST/Redirect/GET:
这是一个简明的例子:
<?php
if ($_SERVER['REQUEST_METHOD']=='POST') {
$err = array();
//performing all validations and raising corresponding errors
if (empty($_POST['name'])) $err[] = "Username field is required";
if (empty($_POST['text'])) $err[] = "Comments field is required";
if (!$err) {
//if no errors - saving data and redirect
header("Location: ".$_SERVER['PHP_SELF']);
exit;
} else {
// all field values should be escaped according to HTML standard
foreach ($_POST as $key => $val) {
$form[$key] = htmlspecialchars($val);
}
}
} else {
$form['name'] = $form['comments'] = '';
}
include 'form.tpl.php';
?>
在这里你可以看到另一个例子,简洁而有力:
Separating Logic/Style in PHP properly
它是显示,添加和编辑数据库内容的完整解决方案,完全用于管理目的。
答案 1 :(得分:0)
您不应在page2.php
上显示消息。
相反:
page2.php
应该处理数据page2.php
应重定向到confirmation.php
confirmation.php
会显示消息。
有关更多信息,请查看Post/Redirect/Get模式。
在评论后修改:但请注意,无论如何,如果他真的想要,您将永远无法阻止用户重新提交表单...
您提供的唯一解决方案是,在提交表单时,如果当前提交的数据已经存在,则检查您的数据库 - 如果已存在 - 请拒绝再次插入。
当然,如果suer在他的输入中改变了一个字母,那么它将不再是相同的数据......