Zend Framework 1.12,原始SQL的执行两次插入相同的记录

时间:2013-06-15 16:25:37

标签: zend-framework zend-db

我知道堆栈中有类似的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')

我已经尝试了以下内容:

  1. 我在html页面上没有“manifesto”属性
  2. 我查看了Chrome和Firefox的网络以查看发送的POSTS / GETS以及操作的控制器 这个INSERT通过POST被称为一次
  3. 我确实会从另一个动作中调用一个视图来呈现,如下所示:

    $这 - >的renderScript( '粗草案/ edit.phtml');

    我不知道这会如何影响执行两次的语句。

  4. 我知道它会被执行两次:

    1. 在发送POST之前,数据库没有任何东西,干净如哨
    2. POST被发送,逻辑发生,再次呈现
    3. 数据库现在具有相同的记录两次(使用从POST插入的名称),因此这不是渲染问题
    4. 它与我执行原始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的执行,我只是不知道它有什么问题。

1 个答案:

答案 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);