这是我的第一个PhP-MySQL项目和我的第一个(永远)问题。我试图建立一个小型门户网站,并且为了学习基础知识,我正在尝试使用前端控制器模式,因为我目前无法使用Observer模式。
前端控制器基本上看起来像下面这样,并调用正确类的适当方法:
$controller =''; $action =''; $queryString ='';
parseURL($controller, $action, $queryString);
$objView = new View;
if ($controller == 'adminlogin' && $action == 'authenticate') {
AdminLogin::getInstance()->authenticate();
} else if ($controller && $action) {
SessionFactory::getSession();
if (isset($_SESSION['userName'])) { // and some more validations
callHook($controller, $action, $queryString);
} else {
$objView->assign('message', SESSION_INVALID);
$objView->display('index');
}
} else {
$objView->display('index');
}
视图也很简单:
public function assign ($variable, $value)
{
$this->passArray[$variable] = $value;
}
public function display ($view)
{
$mapper = ViewmapSingleton::getinstance();
if (1 == preg_match("/\/|\.|\\\\/", $view)) {
echo 'View name should not contain . / or \ ';
}
$template = $mapper->getViewPath($view);
if (!$template || is_dir($template)) {
echo 'The requested view file does not exist';
} else {
extract ($this->passArray);
include_once($template);
}
}
我的问题是提交$ _POST表单时浏览器的BACK按钮。我正在尝试创建一个显示文章列表的管理页面,并允许分页,批量操作和“按标题/类别搜索文章”等。
根据我在这个(最有用的)网站上所读到的,有两种解决方案可以阻止浏览器的后退按钮重新提交表单:
解决方案1.将搜索参数传递给操作(方法),方法是使用“搜索”按钮上的Javascript将它们附加到URL。
<input id="btn1" type="submit" onclick="SubmitForm('index.php? controller=articles&action=showList&articleTitle='+document.getElementById('articleTitle').value)" value="Search" name="btn1"></input>
=&GT;不是最好的方法,因为可能有许多参数,如文章类别等。
解决方案2.不要传递参数,而是在被调用的方法中使用$ _POST数据。将所有内容保存在$ _SESSION中,然后使用header()将其重定向到同一个类中的单独显示方法。从显示功能中的$ _SESSION中提取所有内容并生成视图。
=&gt;不是最好的方法,因为可能有许多参数必须存储在Session中然后提取。
使用前端控制器时,是否有更优雅的方法可以阻止浏览器的后退按钮重新提交表单?我问,因为在使用前端控制器模式时,$ _GET可能没什么用,特别是在某些批量操作需要更改数据库并且类型为“取消发布”时。
请忽略我的无知和帮助!
由于
答案 0 :(得分:0)
您可以通过其他方式使用重定向。
更新:请参阅此解决方案。 Back button re-submit form data ($_POST)
答案 1 :(得分:0)
欢迎来到SO!
首先,除非GET是绝对必要的,否则总是使用POST进行表单提交。 (见下文详情)
您的PHP代码应该完全依赖$ _POST来检索提交的数据($ _GET可能是空的,$ _REQUEST结合$ _GET和$ _POST)。
在您的应用程序收到表单数据并可能已对其进行处理后,重定向浏览器。不要发送HTML响应,而是发送一个302 Moved将浏览器指向下一页:
一个非常基本的例子:
session_start(); // make sure a session is available
if (is_array($_POST) && array_key_exists('submitbutton_name', $_POST)) {
// user has submitted the form
$inputdata = $_POST; // retrieve input data
$next_page_html = determine_next_page($inputdata); // process and construct next page
$_SESSION['page_to_show'] = $next_page_html; // keep the HTML response
// redirect the browser to the very same location, but using GET
header('Location: ' + $_SERVER['REQUEST_URI']);
exit;
}
// the redirect will end up here
if (array_key_exists('page_to_show', $_SESSION)) {
// we have a next page to show
echo $_SESSION['next_page_to_show'];
// don't forget to remove the session entry
unset($_SESSION['next_page_to_show']);
}
else {
// output the starting page, probably the form that the user should submit
}
HTH