有多个页面。这些页面上有链接。这些链接指向带有表单的页面。提交表单时,保存表单的页面将刷新自身以处理提交的数据。
这是问题所在。
当带有表单的页面接收提交的数据并对其进行处理时,应该将用户带回到将他/她带到表单页面的页面。您将如何使用PHP进行此操作?
答案 0 :(得分:3)
我喜欢做的是每次访问一个名为“history”的页面时添加一个会话变量数组,并且只有当最后一个$_SESSION['history']
项不是当前url时才添加到数组中(避免多个最近的页面刷新,表单验证失败等条目。基本上是用户所在位置的面包屑痕迹。处理表单时 - 将用户返回到最新的数组值,如果您愿意,请排除当前表单的URL。如果没有历史记录,请确保设置默认值。
$_SERVER['HTTP_REFERER']
有时会工作,但我遇到了很多问题,并且它在很多情况下都不起作用(刷新,来自同一页面,输入表单网址,来自电子邮件链接)等我个人严格避免它,因为如果你不小心它会导致不稳定的行为和重定向循环。事实上,我永远不会将它用于重定向。
答案 1 :(得分:1)
这个概念被称为Post-Redirect-Get。问题是:用户是否总是回到相同的静态原始页面,或者是否有许多页面可以引导用户访问此表单?如果后者为真,只需添加引用($_SERVER['HTTP_REFERER']
)作为表单元素来记录它们的来源。 php代码:
<?php
class controller {
//for chaining
public static function _() { return new self; }
public function GET() {
//dispay form
}
public function POST() {
//process form
//add errors to session
if (!empty($_SESSION['form errors']) {
$this->redirect($_SERVER['PHP_SELF']);
}
else {
$this->redirect("original-user-location", true, 303);
}
}
private function redirect($loc) {
header("Location: $loc", true, 303);
exit;
}
//ignore PUT, DELETE
public function __call($_, $_) {}
}
controller::_()->$_SERVER['REQUEST_METHOD']();
?>