2016-04-25 16 views
0

使用此解決方案將數組插入數據庫Insert array into MySQL database with PHP會產生MySql錯誤。使用array_keys()進行插入

我的代碼:

// Create arrays and values 
     $columns = "`".implode("`, `",array_keys($value))."`"; 
     $escaped_values = array_map('mysql_real_escape_string', array_values($value)); 
     $values = implode("', '", $escaped_values); 
     // Print arrays and values 
     echo "<br><h4>Columns:</h4> <br>"; 
     echo $columns; 
     echo "<br><h4>Values:</h4><br>"; 
     echo $values; 
     echo "<br><h4>"; 
     // Insert or update 
     $insert = mysql_query("INSERT INTO stocklink2 ($columns) VALUES ('$values') ON DUPLICATE KEY UPDATE ($columns) = ('$values'); "); 
     if($insert === FALSE) { 
      die(mysql_errno($link).mysql_error()); // TODO: better error handling 
     } 
     echo "</h4>"; 

和代碼輸出:

Columns: 

`RecNo`, `Style`, `Upper`, `Split`, `Stocktype`, `Lineno`, `Upper2`, 
`Upper3`, `Upper4`, `Upper5`, `Bottom`, `Price`, `Comments`, `Comments2`, 
`Stocka`, `Stockb`, `Stockc`, `Stockd`, `Stocke`, `Stockf`, `Stockg`, 
`Stockh`, `Stocki`, `Stockj`, `Stockk`, `Stockl`, `Stockm`, `Stockn`, 
`Stocko`, `Resa`, `Resb`, `Resc`, `Resd`, `Rese`, `Resf`, `Resg`, `Resh`, 
`Resi`, `Resj`, `Resk`, `Resl`, `Resm`, `Resn`, `Reso`, `Ordera`, `Orderb`, 
`Orderc`, `Orderd`, `Ordere`, `Orderf`, `Orderg`, `Orderh`, `Orderi`, 
`Orderj`, `Orderk`, `Orderl`, `Orderm`, `Ordern`, `Ordero`, `Availa`, 
`Availb`, `Availc`, `Availd`, `Availe`, `Availf`, `Availg`, `Availh`, 
`Availi`, `Availj`, `Availk`, `Availl`, `Availm`, `Availn`, `Availo`, 
`Currsales`, `Sixmonth`, `Size25s`, `Size30s`, `Size35s`, `Size40s`, 
`Size45s`, `Size50s`, `Size55s`, `Size60s`, `Size65s`, `Size70s`, `Size75s`, 
`Size80s`, `Size85s`, `Size90s`, `Size95s`, `Size100s`, `Size105s`, 
`Size110s`, `Size115s`, `Size120s`, `Size125s`, `Size130s`, `Size135s`, 
`Size140s`, `Size145s`, `Size150s`, `Size20c`, `Size25c`, `Size015c`, 
`Size10c`, `Size30c`, `Size35c`, `Size40c`, `Size45c`, `Size50c`, `Size55c`, 
`Size60c`, `Size65c`, `Size70c`, `Size75c`, `Size80c`, `Size85c`, `Size90c`, 
`Size95c`, `Size100c`, `Size105c`, `Size110c`, `Size115c`, `Size120c`, 
`Size125c`, `Size130c`, `Size135c`, `Size140c`, `Size145c`, `Size150c` 
Values: 


2', 'BNO5839 ', 'CCA ', '8', ' ', '0', ' ', ' ', ' ', ' ', 'BO ', '120', ' 
', ' ', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 
'0', '0', '159', '2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 
'0', '0', '-328', '-2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 
'0', '0', '0', '-418', '-4', '0', '0', '0', '0', '0', '0', '0', '0', '0', 
'0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 
'0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 
'0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 
'0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 
'0 1064You have an error in your SQL syntax; check the manual that 
corresponds to your MariaDB server version for the right syntax to use near 
'(`RecNo`, `Style`, `Upper`, `Split`, `Stocktype`, `Lineno`, `Upper2`, 
`Upper3`, ' at line 1 

欄 「上」 是一個保留字,所以我要逃離的列名。這在我更新單個字段時起作用,但不適用於字段數組。

+2

任何特定的原因,你忽略了這個頁面頂部的大紅色警告通知這裏http://php.net/mysql_query? – Mike

+0

'在重複鍵更新(a,b,c)=('x','y','z');'你從哪裏聽說這是有效的語法?我在INSERT的文檔中看不到它的任何證據。 –

+0

感謝@Mike指針,我將盡快轉換爲mysqli。 –

回答

1

這是錯誤的:

ON DUPLICATE KEY UPDATE ($columns) = ('$values'); "); 
          ^^^^^^^^^^^^^^^^^^^^^ 

你正在構建

on duplicate key update (field, field, field, etc..) = (value, value value, ...) 

可以更新/像平行賦值。你必須做個人

on duplicate key update field1=value1, field2=value2, etc... 
+0

謝謝。刪除ON DUPLICATE用於插入記錄。是否還有一種方法可以將array_keys用於正確的ON DUPLICATE語法? –

+0

不是你建造它們的方式。您必須爲數組中的每個元素創建鍵=值對。 –