Массив INSERT – PDO

У меня есть часть кода, который должен взять данные, введенные в форму, сохранить их в массиве и затем ввести в базу данных. Я использовал var_dump для $ fields и $ data, и они оба возвращают информацию, введенную в поле (в функции add_habbo). Поэтому проблема заключается в том, что код MYSQL / PDO не вставляет эти данные в базу данных.

Это код, который я использую, чтобы вставить их в базу данных:

$fields = '`' . implode('`, `', array_keys($habbo_data)) . '`'; $data = '\'' . implode('\', \'', $habbo_data) . '\''; var_dump($fields); var_dump($data); global $con; $query = "INSERT INTO `personnel` (:fields) VALUES (:data)"; $result = $con->prepare($query); $result->bindParam(':fields', $fields, PDO::PARAM_STR); $result->bindParam(':data', $data, PDO::PARAM_STR); $result->execute(); 

У меня создается впечатление, что у него есть что-то для секций bindParam, возможно PDO :: PARAM_STR? Спасибо за твою помощь!

Обновить:

 $fields = '`' . implode('`, `', array_keys($habbo_data)) . '`'; $fields_data = ':' . implode(', :', array_keys($habbo_data)); var_dump($fields); var_dump($fields_data); global $con; $query = "INSERT INTO `personnel` (`rank`, `habbo_name`, `rating`, `asts`, `promotion_date`, `transfer_rank_received`, `cnl_trainings`, `rdc_grade`, `medals`, `branch`) VALUES ({$fields_data})"; $result = $con->prepare($query); $result->execute($habbo_data); $arr = $result->errorInfo(); print_r($arr); 

Ошибка:

Массив ([0] => 21S01 [1] => 1136 [2] => Количество столбцов не соответствует количеству значений в строке 1)

Related of "Массив INSERT – PDO"

Вы не можете сделать это:

  • Вам нужно добавить каждую переменную / полевое имя и значение отдельно;
  • Вы можете привязывать только значения, а не имена таблиц или полей.

Названия таблиц и полей, которые вам нужно будет вводить непосредственно в ваш sql, чтобы предотвратить проблемы с инъекцией sql, перед этим вам нужно проверить их на белый список.

Так что в вашем случае это будет что-то вроде (черновик):

 // assuming all fields have been checked against a whitelist // also assuming that the array keys of `$habbo_data` do not contain funny stuff like spaces, etc. $fields = '`' . implode('`, `', array_keys($habbo_data)) . '`'; $fields_data = ':' . implode(', :', array_keys($habbo_data)); var_dump($fields); var_dump($fields_data); global $con; $query = "INSERT INTO `personnel` ({$fields}) VALUES ({$fields_data})"; $result = $con->prepare($query); $result->execute($habbo_data); 

Обратите внимание, что я больше не привязываю переменные вручную вручную, но отправляю ассоциативный массив $habbo_data непосредственно в качестве параметра метода execute , см. Пример # 2 .

Подготовленные утверждения не совпадают с копией и вставкой!

 INSERT INTO `personnel` (:fields) VALUES (:data) 

Вы сообщаете здесь PDO / MySQL, что хотите вставить ровно одну часть данных ( :data ) в одно поле ( :field ). Значение представляет собой одну строку, содержащую запятые, а не несколько значений, разделенных запятыми.

Кроме того, вы можете привязывать только данные , а не структурную информацию, такую ​​как имена полей. Вам нужно будет создать такой запрос:

 INSERT INTO `personnel` (foo, bar, baz) VALUES (?, ?, ?) 

а затем привязать данные к трем заполнителям отдельно.