【发布时间】:2011-10-23 06:29:40
【问题描述】:
控制器中的操作从数据库中生成下一个 id 并将其显示在屏幕上作为参考。如果用户单击刷新,如何防止再次调用该操作。
【问题讨论】:
标签: php zend-framework
控制器中的操作从数据库中生成下一个 id 并将其显示在屏幕上作为参考。如果用户单击刷新,如何防止再次调用该操作。
【问题讨论】:
标签: php zend-framework
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;
}
【讨论】:
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;
【讨论】:
虽然这是较早的帖子,但仍有人来这里寻求答案,所以让我提供更多帮助。
重定向表单非常有用,但我们仍然没有阻止人们单击返回按钮并以这种方式重新提交。
解决方案是将表单显示为弹出窗口并在完成后使其消失(使用 jquery 很容易完成)或为每个事务生成唯一 id 并检查 id 是否以前使用过。 见文章:http://www.boutell.com/newfaq/creating/stoprefresh.html
希望对你有帮助。
【讨论】:
您可以通过实现 302 重定向来做到这一点
header('HTTP/1.1 302 Found');
header('Location: displayId.php?id=5');
die();
假设你有这些页面
Form.php 只显示表单并通过 POST 将数据发送到 processForm.php。 在 processForm.php 中,您可以解析数据并发出重定向到 displayId.php 以及您希望在 GET 参数中显示的 id。
这样当用户刷新页面(displayId.php)时,表单数据不会再次处理。
【讨论】:
我知道您正在尝试在 Zend Framework 中执行此操作,但我只是说我在追求相同的功能。刚把所有东西都移到了 ZF,我很失望地看到这个功能没有内置。
我曾经让每个表单提交到 process.php,它处理所有 GET、POST 请求,然后保存结果(如错误和成功消息)并将您重定向到新位置。
如果设置了 $_SESSION['post_data'],我会 $_POST = $_SESSION['post_data'];然后将其从会话中删除。
这很好用,但现在我在 ZF 中也需要同样的东西 :D 正如我所说...有点失望,因为我不相信有人希望出现一个对话框询问重新提交数据.. 到底是做什么的这对您的最终用户意味着什么?什么都没有!
【讨论】: