Вставка php pdo multi array

Я играю в течение нескольких часов и пытаюсь разобраться в этом, но выглядит как жесткий орех, чтобы взломать.

Я могу сделать одиночную вставку массива

$person = array('name' => 'Wendy', 'age' => '32'); 

но если я хочу несколько таких:

 $person = array(array('name'=>'Dan', 'age'=>'30'), array('name' => 'John', 'age' => '25'), array('name' => 'Wendy', 'age' => '32')); 

Это не работает? Любая помощь будет оценена по достоинству.

Для множественной вставки:

 public function insertPdo($table, $data){ try{ if (!is_array($data) || !count($data)) return false; $bind = ':' . implode(', :', array_keys($data)); $sql = 'INSERT INTO ' . $table . ' (' . implode(', ',array_keys($data)) . ') ' . 'values (' . $bind . ')'; $sth = $this->__dbh->prepare($sql); $result = $sth->execute($data); } catch(PDOException $e){ echo $e->getMessage(); } } 

Для одиночной вставки

 $person = array('name'=>'Dan', 'age'=>'30'); $db->insertPdo('test_pdo',$person); // For Multi Insertion, I'm trying to use this in above function foreach ($data as $row) { $result = $sth->execute($row); }; $person = array(array('name'=>'Dan', 'age'=>'30'), array('name' => 'John', 'age' => '25'), array('name' => 'Wendy', 'age' => '32')); $db->insertPdo('test_pdo',$person); 

И ошибка:

Ошибка: SQLSTATE [HY093]: Недопустимый номер параметра: количество связанных переменных не совпадает с числом токенов

Чтобы использовать скорость вставки нескольких вложений в MySQL ( http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html ), вы можете использовать подготовленный оператор, который строит более крупный запрос. Это добавляет сложности в более итеративный подход, поэтому, вероятно, это стоит только для систем с высоким спросом или довольно больших наборов данных.

Если у вас есть данные, как вы предложили выше:

 $person = array(array('name'=>'Dan', 'age'=>'30'), array('name' => 'John', 'age' => '25'), array('name' => 'Wendy', 'age' => '32')); 

Мы хотим создать запрос, который выглядит примерно так:

 insert into table (name, age) values (?,?), (?,?), (?,?); 

Чтобы вытащить это вместе, вам нужно что-то совсем не похоже на это:

 $pdo->beginTransaction() // also helps speed up your inserts $insert_values = array(); foreach($person as $p){ $question_marks[] = '(?,?)'; $insert_values = array_merge($insert_values, array_values($p)); } $sql = "INSERT INTO table_name (name, age) VALUES " . implode(',', $question_marks); $stmt = $pdo->prepare ($sql); try { $stmt->execute($insert_values); } catch (PDOException $e){ // Do something smart about it... } $pdo->commit(); 

Вы не можете сделать это автоматически. Вместо этого вам нужно выполнить итерацию вручную и выполнить каждую запись:

 for ($person as $row) { $sth->execute($row); }