0

我知道堆栈中有类似的情况,我已经检查过了,答案并没有引导我找到我的。

这是交易:

我需要执行原始 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')

我已经尝试过以下方法:

  1. 我在呈现的 html 页面上没有“manifesto”属性
  2. 我已经使用 Chrome 和 Firefox 查看了网络以查看 POSTS/GETS 被发送,并且执行此 INSERT 操作的控制器通过 POST 被调用一次
  3. 确实,我从另一个要渲染的动作中调用视图脚本,如下所示:

    $this->renderScript('草稿/edit.phtml');

    我看不出这会如何影响语句被执行两次。

我知道它被执行了两次:

  1. POST发送前,数据库什么都没有,干净利落
  2. POST 被发送,逻辑发生,from 再次呈现
  3. 数据库现在有两次相同的记录(名称是从 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 执行中的原因,我只是不知道它有什么问题。

4

1 回答 1

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;
    }

所以->query(..)Zend_Db_Adapter 中的方法已经执行了上述查询。因此,如果我调用 ->execute()它返回的语句,我将成为导致第二次插入的人。

工作代码:

$db_adapter = Zend_Db_Table::getDefaultAdapter();
 ....query gets built...
$db_adapter->query($query);
于 2013-06-17T13:36:04.457 回答