【发布时间】:2011-12-15 18:44:15
【问题描述】:
不知何故,当我在以下设置中使用gotoSimple 时,我的数据将被$object->save() 在secondAction() 中保存两次。
public function firstAction(){
// get data
// process postdata, if any
if( $form->isValid( $postdata ) ) {
$this->_helper->getHelper( 'Redirector' )->gotoSimple( 'second' );
}
}
public function secondAction(){
// get data
// process postdata, if any
if( $form->isValid( $postdata ) ) {
if( $object->save( $postdata ) ) {
// set flashmessage
$this->_helper->getHelper( 'Redirector' )->gotoSimple( 'index' );
}
}
}
经过数小时的调试,我得出的结论是,secondAction() 中的 gotoSimple() 命令会在重定向到 indexAction() 之前触发 secondAction()。我已经确定indexAction() 不可能重定向回secondAction()。
更有趣的是:这只发生在 IE7 和 IE8 中。谁能指出我这个奇怪行为可能来自哪里以及我该如何解决这个问题?
更新
通过在 gotoSimple() 命令之前的 secondAction() 中使用以下代码行,我可以 100% 确定当我按下提交按钮时,secondAction() 被调用了两次:
if( isset( $_SESSION['xyz-zyx'] ) ) {
$this->_helper->getHelper( 'flashMessenger' )->addMessage( 'I\'ve already been here!' );
unset( $_SESSION['xyz-zyx'] );
}
$_SESSION['xyz-zyx'] = true;
有什么想法吗?
【问题讨论】:
-
刚刚检查过,但是设置重定向器的代码并没有改变任何东西。
-
您是否使用执行重定向的重写规则?并且在重定向之后,$_POST 数据应该不再可用...
-
是的,我正在使用重写规则,但我在这里不依赖 $_POST,当我离开 firstAction() 时,我将数据存储在会话对象中,并且在 secondAction() 中可用.您可以将此设置视为一个非常简单的向导。问题是,我可以在保存后取消设置会话对象,但这将在控制器代码第二次被重定向激活时触发错误。解决此问题的一种可能方法是检查 $_POST 参数,但是仍然会第二次激活代码...数据不会被保存两次,也不会出现错误...但仍然如此。 .
-
如果有重定向并且您依赖会话数据,我认为除了将您的数据标记为已处理以避免两次保存数据之外,没有其他方法。我认为 gotoSimple() 不太可能执行两个重定向...
标签: php zend-framework session internet-explorer-8 internet-explorer-7