【问题标题】:Prevent form resubmit in Zend framework?防止在 Zend 框架中重新提交表单?
【发布时间】:2011-10-23 06:29:40
【问题描述】:

控制器中的操作从数据库中生成下一个 id 并将其显示在屏幕上作为参考。如果用户单击刷新,如何防止再次调用该操作。

【问题讨论】:

    标签: php zend-framework


    【解决方案1】:

    Zend Framework 的 post-redirect-get 模式通常涉及将表单的操作留空(因此它会发布到自身),然后在您不想再次显示表单时重定向(成功后)。

    public function newAction() {
        $form = new Form_Foo();
        if($this->_request->isPost()) {
            if($form->isValid($this->_request->getPost()) {
                //save or whatever
                return $this->_redirect('path/to/success');
            }
            // else fall through
        }
        $this->view->form = $form;
    }
    

    【讨论】:

    • 如果表单数据有效,那么我会对其进行一些处理。如何将处理的输出传递给用户被重定向到的视图页面?
    【解决方案2】:
    if ($this->isPost()) {
       // Check validation
       if ($error) {
           $dataToMove = array();
           // $dataToMove is array that you want to pass with redirect
           // It can be an array of errors or form data that user has entered
    
           // Use FlashMessenger helper to pass data to redirection via Zend_Session
           $this->_helper->getHelper('FlashMessenger')->addMessage($dataToMove);
    
           // And redirect page to form url
           $this->_helper->getHelper('Redirector')->goToUrl('/form/url/');
    }
    
    // If not posted, get data from FlashMessenger
    $data = $this->_helper->getHelper('FlashMessenger')->getMessages();
    
    // And assign to view or make that you want
    $this->view->formData = $data;
    

    【讨论】:

    • 我喜欢这个答案,因为它允许您重定向并保留成功/错误消息。
    【解决方案3】:

    虽然这是较早的帖子,但仍有人来这里寻求答案,所以让我提供更多帮助。

    重定向表单非常有用,但我们仍然没有阻止人们单击返回按钮并以这种方式重新提交。

    解决方案是将表单显示为弹出窗口并在完成后使其消失(使用 jquery 很容易完成)或为每个事务生成唯一 id 并检查 id 是否以前使用过。 见文章:http://www.boutell.com/newfaq/creating/stoprefresh.html

    希望对你有帮助。

    【讨论】:

      【解决方案4】:

      您可以通过实现 302 重定向来做到这一点

      header('HTTP/1.1 302 Found');
      header('Location: displayId.php?id=5');
      die();
      

      假设你有这些页面

      • form.php
      • processForm.php
      • displayId.php

      Form.php 只显示表单并通过 POST 将数据发送到 processForm.php。 在 processForm.php 中,您可以解析数据并发出重定向到 displayId.php 以及您希望在 GET 参数中显示的 id。

      这样当用户刷新页面(displayId.php)时,表单数据不会再次处理。

      【讨论】:

      • 我对如何在 Zend Framework 中完成更感兴趣。
      • 实际上你应该使用 303,而不是 302。
      • 好点,多谢指出,又学到了。
      【解决方案5】:

      我知道您正在尝试在 Zend Framework 中执行此操作,但我只是说我在追求相同的功能。刚把所有东西都移到了 ZF,我很失望地看到这个功能没有内置。

      我曾经让每个表单提交到 process.php,它处理所有 GET、POST 请求,然后保存结果(如错误和成功消息)并将您重定向到新位置。

      如果设置了 $_SESSION['post_data'],我会 $_POST = $_SESSION['post_data'];然后将其从会话中删除。

      这很好用,但现在我在 ZF 中也需要同样的东西 :D 正如我所说...有点失望,因为我不相信有人希望出现一个对话框询问重新提交数据.. 到底是做什么的这对您的最终用户意味着什么?什么都没有!

      【讨论】:

        猜你喜欢
        • 2023-03-03
        • 2011-04-24
        • 1970-01-01
        • 2019-03-28
        • 2013-07-24
        • 1970-01-01
        • 2019-07-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多