我知道堆栈中有类似的situation,我已经检查过了,答案并没有引导我去找我的。
这是交易:
我需要执行原始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')
我已经尝试了以下内容:
我确实会从另一个动作中调用一个视图来呈现,如下所示:
$这 - >的renderScript( '粗草案/ edit.phtml');
我不知道这会如何影响执行两次的语句。
我知道它会被执行两次:
它与我执行原始SQL的方式有关,因为如果我使用Zend_Db_Table_Abstract附带的->insert($data)
方法(显然我声明了一个从这个抽象类扩展并将其绑定到相应表的类)它不会两次插入记录。事实是,我想使用原始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的执行,我只是不知道它有什么问题。
答案 0 :(得分:4)
我应该从一开始就这样做,谢谢大家的帮助,感谢你的时间。
我知道问题出在我的语法上,但我不知道为什么。在查看人们如何执行原始sql执行的不同示例之后,我仍然不明白为什么。所以我继续在 Zend库中打开了类Zend_Db_Adapter_Abstract
,并查找了我用来执行语句的'query()'方法。
public function query($sql, $bind = array())
{
...some logic...
// prepare and execute the statement with profiling
$stmt = $this->prepare($sql);
**$stmt->execute($bind);**
// return the results embedded in the prepared statement object
$stmt->setFetchMode($this->_fetchMode);
return $stmt;
}
因此,Zend_Db_Adapter中的->query(..)
方法已经执行了所述查询。所以,如果我打电话
->execute()
在它返回的语句中,我将成为导致第二次插入的。
工作代码:
$db_adapter = Zend_Db_Table::getDefaultAdapter();
....query gets built...
$db_adapter->query($query);