1

这是我的第一个 PhP-MySQL 项目,也是我的第一个(曾经)问题。我正在尝试制作一个小型门户网站,并且为了学习基础知识,我正在尝试使用前端控制器模式,因为我目前对使用观察者模式没有信心。

前端控制器基本上如下所示,并调用正确类的适当方法:

$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>

=> 不是最好的方法,因为可能有很多参数,比如文章类别等。

解决方案 2. 不要传递参数,而是在被调用的方法中使用 $_POST 数据。将所有内容保存在 $_SESSION 中,然后使用 header() 重定向到同一类中的单独显示方法。在 display 函数中从 $_SESSION 中提取所有内容并生成视图。

=>不是最好的方法,因为可能有很多参数必须存储在 Session 中然后提取。

使用前端控制器时,是否有更优雅的方法来防止浏览器的后退按钮重新提交表单?我问是因为在使用前端控制器模式时,$_GET 可能没有多大用处,尤其是在某些批量操作需要更改数据库并且属于“取消发布”类型的情况下。

请忽略我的无知和帮助!

谢谢

4

2 回答 2

0

其他可以做到这一点的方法是使用重定向。

更新:参考这个解决方案。 后退按钮重新提交表单数据 ($_POST)

于 2013-10-18T19:37:00.523 回答
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
}

高温高压

于 2013-10-18T19:38:14.033 回答