Как добавить всех Иван Иванычей одним запросом?

Есть массив который надо занести в БД:
$people = array('Иван Иваныч', 'Сергей Сергеич', 'Сидор Сидорович');
for(){
    $b=$pdo->prepare(" INSERT INTO `organization` SET name=:name ");
    $b->bindParam(":name",$people[$i]);
    $b->execute();
}

Но запросы внутри цикла ставить вроде как нехорошо. Как правильно в этом случае сделать, может в PDO есть какие-то специальные возможности на этот случай?
  • Вопрос задан
  • 456 просмотров
Решения вопроса 3
@kshvakov
Правильно как-то так:
$people = array('Иван Иваныч', 'Сергей Сергеич', 'Сидор Сидорович');
$b=$pdo->prepare(" INSERT INTO `organization` SET name=:name ");
for(){  
    $b->bindParam(":name",$people[$i]);
    $b->execute();
}


Но, насколько я помню в pdo prepare statements не особо работают

PS: может ну его нафиг этот pdo с php пока не поздно ? ;)
Ответ написан
27cm
@27cm
TODO: Написать статус
Если в запросе участвует только один столбец:
$people = array('Иван Иваныч', 'Сергей Сергеич', 'Сидор Сидорович');

// INSERT INTO `organization` (`name`) VALUES (?), (?), (?)
$query = "INSERT INTO `organization` (`name`) VALUES " 
       . implode(', ', array_fill(0, sizeof($people), '(?)'));

$pdo->prepare($sql)->execute($people);


Пример для трёх столбцов:
$people = array(
    array('Иван Иваныч', 'Москва', 23),
    array('Сергей Сергеич', 'Тула', 42),
    array('Сидор Сидорович', 'Псков', 30),
);

// Приводим массив к виду:
// array('Иван Иваныч', 'Москва', 23, 'Сергей Сергеич', 'Тула', 42, 'Сидор Сидорович', 'Псков', 30);
$values = array();
foreach ($people as $p) {
    $values = array_merge($values, $p);
}

// Создаём строку вида (?, ?, ?)
$placeholders = '(' . implode(', ', array_fill(0, 3, '?')) . ')';

// INSERT INTO `organization` (`name`, `city`, `age`) VALUES (?, ?, ?), (?, ?, ?), (?, ?, ?)
$query = "INSERT INTO `organization` (`name`, `city`, `age`) VALUES " 
       . implode(', ', array_fill(0, sizeof($people), $placeholders));

$pdo->prepare($sql)->execute($values);
Ответ написан
marrk2
@marrk2 Автор вопроса
Так всё работает, извините за неинформативные названия переменных, но кому надо тот поймёт что к чему. Единственное что не могу не понять, запрос же это execute() вроде, а он стоит внутри цикла, так что всё равно тысячи запросов выходит? Чисто на prepare и bindParam выходит экономим?
$b=$pdo->prepare(" INSERT INTO `organization` SET num=:num, letter=:letter ");
$b->bindParam(":num",$a1);
$b->bindParam(":letter",$a2);
for ($i = 0; $i < count($ct); $i++) {
    $a1 = $ct[$i];
    $a2 = $st[$i];
    $b->execute();
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы