2015-07-20 78 views
-1

我有這樣的數組:二維數組來更新到mysql數據庫

Array (
    [0] => Array 
     (
      [0] => 2 
     ) 

    [1] => Array 
     (
      [0] => 2015-07-20 
     ) 

    [2] => Array 
     (
      [0] => 2 
      [1] => 5 
     ) 

    [3] => Array 
     (
      [0] => 70 
      [1] => 17 
     ) 

    [4] => Array 
     (
      [0] => 4 
      [1] => 
     ) 

    [5] => Array 
     (
      [0] => 66 
      [1] => 17 
     ) 
) 

現在我想更新數據庫這樣

Array 
(
    [0] => Array 
     (
      [0] => 2 
      [1] => 2015-07-20 
      [2] => 2 
      [3] => 70 
      [4] => 4 
      [5] => 66 
     ) 
    [1] => Array 
     (
      [0] => 2 
      [1] => 2015-07-20 
      [2] => 5 
      [3] => 17 
      [4] => 
      [5] => 17 
     ) 
) 

這可能嗎?或者qny以其他方式從數組更新記錄?

我有這樣的foreach循環輸出: -

UPDATE update_shopwise_stock SET shop_id =2 datetime =2015-07-20 item_id =2 item_id =5 before_sale_totitem_qty =70 before_sale_totitem_qty =17 after_sale_totitem_qty =4 after_sale_totitem_qty = restOfItem =66 restOfItem =17 note =NULL WHERE shop_id =2 

,但我想這一點: -

UPDATE update_shopwise_stock SET shop_id =2 datetime =2015-07-20 item_id =2 before_sale_totitem_qty =70 after_sale_totitem_qty =4 restOfItem =66 note =NULL WHERE shop_id =2 

UPDATE update_shopwise_stock SET shop_id =2 datetime =2015-07-20 item_id =5 before_sale_totitem_qty =17 after_sale_totitem_qty = restOfItem =17 note =NULL WHERE shop_id =2 

任何幫助嗎?

+0

MySQL UPDATE語法需要用逗號分隔的列/值列表。 https://dev.mysql.com/doc/refman/5.0/en/update.html – Lasse

回答

1

如果我理解你的問題,你需要將數據從第一個數組變換到第二個數組,然後你可以使這個foreach?

如果是,則使用來自0索引的默認值轉換爲數組。適用於多個版本,因此您可以添加索引3,5等,它仍然可以工作。

$default = array(); 

$versions = array(); 
foreach($array as $key => $values){ 
    foreach($values as $version => $value){ 
     if($version === 0){ 
      $default[$key] = $value; 
      continue; 
     } 
     if(!array_key_exists($version, $versions)){ 

     } 
     $versions[$version][$key] = $value; 
    } 
} 

$return = array(
    0 => $default, 
); 
foreach($versions as $version => $versionData){ 
    $return[$version] = $versionData+$default; 
} 

如果需要的foreach建立你的SQL查詢它是在這裏:

$columns = array(
    'shop_id', 'datetime', 'item_id', 'before_sale_totitem_qty', 'after_sale_totitem_qty', 'restOfItem' 
); 

foreach($return as $version => $data){ 
    $columnData = array(); 
    foreach($data as $columnIndex => $value){ 
     $columnData[] = sprintf('%s = %s', $columns[$columnIndex], $value); 
    } 
    $sql = sprintf('UPDATE update_shopwise_stock SET %s WHERE shop_id=%d', implode(', ', $columnData), $data[0]); 
} 

但我個人的建議是不要使用這樣的SQL,而是使用PDO準備語句和更好的安全性。對於準備語句是循環的位置:

$columns = array(
    'shop_id', 'datetime', 'item_id', 'before_sale_totitem_qty', 'after_sale_totitem_qty', 'restOfItem' 
); 

foreach($return as $version => $data){ 
    $columnPrepare = array(); 
    $columnData = array(); 
    foreach($data as $columnIndex => $value){ 
     $columnName = $columns[$columnIndex]; 
     $columnPrepare[] = sprintf('%s = :%s', $columnName, $columnName); 
     $columnData[$columnName] = $value; 
    } 
    $query = $db->prepare(sprintf("UPDATE update_shopwise_stock SET %s WHERE shop_id=:shop_id", implode(', ', $columnPrepare))); 
    foreach($columnData as $column => $value){ 
     $query->bindParam(sprintf(':%s', $column), $value); 
    } 
    $query->execute(); 
} 

一切都是未經檢驗的,可以有一些錯誤,最終的性能問題。它是基於問題的問題,並只顯示如何解決這個問題。

+0

不需要龐大的代碼我只是使用array_map解決了我的問題,Thx試圖回答我的問題 –