Привет, я делаю класс для выполнения нескольких вложений в pdo.
Это что-то вроде этого
INSERT INTO $table (key1,key2,key3,etc) VALUE (value1,value2,value3,etc), (value1,value2,value3,etc), (value1,value2,value3,etc)
После поиска я узнал, что мне нужно построить что-то вроде
INSERT INTO $table (key1,key2,key3,etc) VALUE (:key1,:key2,:key3,etc), (:key1,:key2,:key3,etc), (:key1,:key2,:key3,etc)
затем выполните с этим $this->execute($data);
где $data
0 => array 'key1' => 'value1' 'key2' => 'value2' 'key3' => 'value3' 1 => array 'key1' => 'value1' 'key2' => 'value2' 'key3' => 'value3' etc
проблема в том, что я все еще получаю ошибку Array to string conversion
в $insert->execute($data);
как я могу это исправить?
вот фрагмент того, что я делаю.
public function multipleInsert($table, $data = array()) { # INSERT (name) VALUE (value),(value) if (count($data) > 1) { $fieldnames = array_keys($data[0]); $count_inserts = count(array_values($data)); $count_values = count(array_values($data[0])); # array(????) untill x from first data for($i = 0; $i < $count_values; $i++) { $placeholder[] = '?'; } # array((????),(????),(????)) for query for ($i=0; $i < $count_inserts; $i++) { $placeholders[] = '('. implode(',',$placeholder) . ')'; } $query = 'INSERT INTO '. $table; $query .= '(`'. implode('`, `', $fieldnames) .'`)'; $query .= ' VALUES '. implode(', ', $placeholders); $insert = $this->start->prepare($query); $i = 1; foreach($data as $item) { foreach ($item as $key => $value) { $insert->bindParam($i++, $item[$key]); } } echo $query; $insert->execute(); $return['status'] = true; $return['lastid'] = $this->start->lastInsertId(); return $return; } else { die('$data is less then two array, use single insert instead.'); } }
Легкий способ избежать осложнений – это что-то вроде этого
$stmt = $pdo->prepare('INSERT INTO foo VALUES(:a, :b, :c)'); foreach($data as $item) { $stmt->bindValue(':a', $item[0]); $stmt->bindValue(':b', $item[1]); $stmt->bindValue(':c', $item[2]); $stmt->execute(); }
Однако это выполняется несколько раз. Таким образом, для этого нам нужно создать длинный одиночный запрос.
Вот пример того, как мы можем это сделать.
$query = "INSERT INTO foo (key1, key2) VALUES "; //Prequery $qPart = array_fill(0, count($data), "(?, ?)"); $query .= implode(",",$qPart); $stmt = $dbh -> prepare($query); $i = 1; foreach($data as $item) { //bind the values one by one $stmt->bindValue($i++, $item['key1']); $stmt->bindValue($i++, $item['key2']); } $stmt -> execute(); //execute