2013-06-11 68 views
0

我真的很感谢有人帮助解决了这个问题。 我在Magento的方式 我有这种方法,它基本上需要两组数据,并与他们创建一个SQL语句。Foreach循环返回查询两次

private function _getInsertSql($data, $itemData) 
{ 

    $sql = 'insert into orders_headers ('; 
    $keys = array_keys($data); 
    $sql .= implode(', ', $keys); 
    $sql .= ') values ('; 
    foreach($data as $value) { 
     $type = $value['type']; 
     $vv = $value['value']; 
     if ($type == 'number') { 
      $sql .= $vv; 
     } else { 
      $sql .= $this->_db->quote($vv); 
     } 
     $sql .= ','; 
    } 
    $sql = substr($sql, 0, strlen($sql)-1); 
    $sql .= ');'; 

    $first = 0; 
    $sql .= 'insert into orders_lines ('; 
    foreach($itemData as $data) { 
     if ($first <= 0) { 
      $keys = array_keys($data); 
      $sql .= implode(', ', $keys); 
      $sql .= ') values ('; 
     } else { 
      $sql .= '('; 
     } 
     foreach($data as $value) { 
      $type = $value['type']; 
      $vv = $value['value']; 
      if ($type == 'number') { 
       $sql .= $vv; 
      } else { 
       $sql .= $this->_db->quote($vv); 
      } 
      $sql .= ','; 
     } 
     $sql = substr($sql, 0, strlen($sql)-1); 
     $sql .= '),'; 
     $first++; 
    } 

    $sql = substr($sql, 0, strlen($sql)-1); 

    $sql .= ';'; 
    Mage::log("START" .$sql . "END", NULL, 'sql.log'); 
    return $sql; 
} 

正如你可以看到在最后我注销.sql和奇怪它会产生相同的查询两次。因此在DB中插入相同的行两次。

我不能为我的生活看到它的循环到顶部和再次创建查询。

输出SQL是:

2013-06-11T15:37:45 + 00:00 DEBUG(7):STARTinsert成orders_headers(的orderID,日期时间,IP,的customerID,名,姓,地址1,地址,城镇,县,国家,邮编,电话,传真,电子邮件,公司,deliveryName,deliveryAddress1,deliveryAddress2,deliveryTown,deliveryCounty,deliveryCountry,deliveryPostcode,deliveryTelephone,goodsTotal,shippingTotal,taxTotal,discountTotal,order_state,order_status,order_comments,order_save_time,状态,shippingMethod,paymentID,paymentName,paymentDate,shippingID,orderNotes,paymentNameNative,shippingMethodNative,referURL,accTypeID,offerCode,randID,e_website,e_status,e_purchaseordref,e_statuschk,e_accepted)values('100004952','20130611153744','127.0.0.1' ,0,” TES','S','S','','S','','GB','S','SA','','[email protected]','','TES S ”, 'S', '', 'S', '', 'GB', 'S', 'SA',28.88,7.25,4.81,0, '新', 'pending_awaiting_payment', '', '20130611153745' , 'P', 'udropship_default',5, '查询', '',0, '', '查看', 'udropship_default', '主/站点/',0, '', '100004952','主/ ('order',productID,code,name,qty,weight,price,nameNative,taxamount,ooprice,ootaxamount,supplierID,supplierCost,supplierCostCurrencyID);插入xm1_orders_lines ,'order_state,order_status,order_save_time)values('100004952',2106,'UGWA050','Stainless Steel
葡萄酒冰桶,magnum 9 pt',1,10.0900,16.82,'不锈钢
葡萄酒冰桶,magnum 9 pt' ,'3.36,0,0,5,10.0900,1','new','pending_awaiting_payment','20130611153745'); END 2013-06-11T15:37:45 + 00:00 DEBUG(7):START插入orders_headers orderID,datetime,ip,customerID,姓氏,姓氏,地址1,地址2,城镇,县,国家邮政编码,电话,传真,电子邮件,公司,deliveryName,deliveryAddress1,deliveryAddress2,deliveryTown,deliveryCounty,deliveryCountry,deliveryPostcode,deliveryTelephone,goodsTotal,shippingTotal,taxTotal,discountTotal,order_state,order_status,order_comments,order_save_time,status,shippingMethod,paymentID, ('100004952','20130611153744','127.0.0.1',0,'TES,paymentName,paymentID,shippingID,orderNotes,paymentNameNative,shippingMethodNative,referURL,accTypeID,offerCode,randID,e_website,e_status,e_purchaseordref,e_statuschk,e_accepted) ','S','S','','S','','GB','S','SA','','Sggila.com','','TES S' , 'S', '', 'S', '', 'GB', 'S', 'SA',28.88,7.25,4.81,0, '新', 'pending_awaiting_payment', '', '20130611153745', 'P', 'udropship_default',5, '查询', '',0, '', '查看', 'udropship_default', '主/站点/',0, '', '100004952','/主/ ','ZZZ888','','2106','');插入xm1_orders_lines(订单ID,产品ID,代码,名称,数量,重量,价格,名称,本地,taxamount,ooprice,oota ('100004952',2106,'UGWA050','不锈钢
葡萄酒冰桶,大酒杯9',1,10.0900,16.82,'不锈钢
葡萄酒(xamount,supplierID,供应商成本,supplierCostCurrencyID,order_state,order_status,order_save_time)冰桶,magnum 9 pt',3.36,0,0,5,10.0900,1,'new','pending_awaiting_payment','20130611153745'); END

任何人都可以提供帮助吗?

谢谢

+0

你可以发布什么$ sql中的终值是什么? – Joe

+0

我已将它添加到最初的问题 – user2475259

回答

2

我认为foreach不给你两次查询,但你的方法被调用两次。代码中的日志方法在foreach循环之外,日志文件本身包含2个条目(包含在START和END中)。 最好找出你在哪里调用方法并在那里调试。

0

经过一番探索后,我发现afterordersaved事件被调用两次。

我相信这是customer_save_observer_executed 要解决这个问题,我只是做了以下内容: -

if(Mage::register('customer_save_observer_executed')) { 
return; 
} 
Mage::log('afterOrderSavedObserver call', NULL, 'method_calls.log');     
$model = Mage::getModel('ordersintegration/export'); 
$model->afterOrderSavedXm1($order); 
Mage::register('customer_save_observer_executed', true); 

这现在工作