2016-04-25 4 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

'ON DUPLICATE KEY UPDATE (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

Не так, как вы их строите. вам нужно создать пары ключ = значение для каждого элемента вашего массива. –

Смежные вопросы