我知道堆栈中有类似的情况,我已经检查过了,答案并没有引导我找到我的。
这是交易:
我需要执行原始 SQL,准确地说是 INSERT。我也有多个值要插入。没问题,因为 Zend 让您使用 Zend_Db_Table 中的“查询”(我使用默认适配器,在 application.ini 文件中初始化)。
$db_adapter = Zend_Db_Table::getDefaultAdapter();
....query gets built...
$stmt = $db_adapter->query($query);
$stmt->execute();
这样做时var_dump($query);
,我看到的是:
INSERT INTO tableName (col1,col2,col3) VALUES ('value1', 'value2', 'value3')
我已经尝试过以下方法:
- 我在呈现的 html 页面上没有“manifesto”属性
- 我已经使用 Chrome 和 Firefox 查看了网络以查看 POSTS/GETS 被发送,并且执行此 INSERT 操作的控制器通过 POST 被调用一次。
确实,我从另一个要渲染的动作中调用视图脚本,如下所示:
$this->renderScript('草稿/edit.phtml');
我看不出这会如何影响语句被执行两次。
我知道它被执行了两次:
- POST发送前,数据库什么都没有,干净利落
- POST 被发送,逻辑发生,from 再次呈现
- 数据库现在有两次相同的记录(名称是从 POST 中插入的),所以这不是渲染问题
它与我执行原始 SQL 的方式有关,因为如果我使用->insert($data)
Zend_Db_Table_Abstract 附带的方法(显然我声明了一个从这个抽象类扩展的类并将其绑定到适当的表),它不会插入记录两次。问题是,我想使用原始 SQL。
我真的很感谢你的帮助!
按要求扩展:
控制器代码:
public function saveAction()
{
$request = $this->getRequest();
if (!$request->isPost())
$this->_sendToErrorPage();
$this->_edit_roughdraft->saveForm($request->getPost());
$this->view->form = $this->_edit_roughdraft->getForm();
$this->renderScript('rough-draft/edit.phtml');
}
模型类的代码(负责从 POST 中的数据中保存表单):
public function saveForm($form_data) {
$db = new Application_Model_DbTable_RoughDrafts();
$id = $form_data['id'];
$db->update($this->_get_main_data($form_data), array('id=?' => $id));
/* Main data pertains to getting an array with the data that belongs to yes/no buttons
* and text input. I need to do it as so because the other data belongs to a dynamically
* built (by the user) multi_select where the options need to be deleted or inserted, that
* happens below
*/
$multi_selects = array('responsables', 'tareas', 'idiomas', 'habilidades', 'perfiles');
foreach($multi_selects as $multi_select){
if(isset($form_data[$multi_select]) && !empty($form_data[$multi_select])){
$function_name = '_save_'.$multi_select;
$this->$function_name($form_data[$multi_select], $id);
}
}
$this->_form = $this->createNewForm($id, true);
//The createNewForm(..) simply loads data from data_base and populates form
}
尽管我也使用过,但我确实想明确一点$db->insert($data)
,其中 $db 是一个从 Zend_Db_Table_Abstract 扩展而来的类(关联到一个表)。在这种情况下,记录只插入一次。这就是让我相信问题出在我的原始 sql 执行中的原因,我只是不知道它有什么问题。