Я играю в течение нескольких часов и пытаюсь разобраться в этом, но выглядит как жесткий орех, чтобы взломать.
Я могу сделать одиночную вставку массива
$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); }