2015-02-05 2 views
0

В настоящее время я строю ПДО вставить похожее на это:PDO связывают PARAMS в перекручивание массив

foreach($r->occurrences as $row) { 
    $arr[] = array(
     'id' => $id, 
     'name' => $name, 
     'start' => $row->getTimestamp(), 
     'end' => $row->getTimestamp() + $duration, 
     'note' => $notes 
    ); 
}; 

$keys = implode(',', array_keys($arr[0])); 

// Format into ('1','2','4'),('8','3','4') for insertion 
foreach ($repBkgArr as &$array) { 
    $array = "('".implode("','", $array)."')"; 
} 

$values = implode(',', $arr); 

$query = "INSERT INTO table ($keys) VALUES $values"; 

$db->execute($query); 

В этом случае я не могу, очевидно, просто связать переменные во втором параметре функции исполнения, потому что я 'm пакетная вставка нескольких наборов данных.

$db->execute($query, array(':id' => $id, ':name' => $name); 

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

+0

Вместо пакетной вставки, можно просто подготовить заявление для одного набора, а затем цикл по списку, чтобы выполнить его с различными параметры. Такова формулировка подготовленных заявлений. :) – mario

+0

Глупый вопрос ... Выполняет ли цикл над подготовленным оператором выполнение нескольких запросов? Мне нужно убедиться, что я ограничиваю, как часто я попадаю в БД, и в этом запросе есть потенциально тысячи «партий». – Tim

+0

Ваши данные попадают на сервер в любом случае. С помощью подготовленного оператора вы просто передадите данные с несколькими пакетами, а не с одним длинным блоком данных, потребляющим кучи памяти на обоих концах. Просто используйте транзакцию для имитации одной партии. – mario

ответ

1

Простейший способ: просто добавьте префикс индекса для каждого значения связывания, как это:

$sql  = 'INSERT INTO `tabke`(id, name) VALUES '; 
$bind = array(); 
$sqlRows = array(); 
foreach ($r->occurrences as $index => $row) { 
    $sqlRows[] = "(:id_$index, :name_$index)"; 
    $bind[':id_'.$index] = $row['id']; 
    $bind[':name_'.$index] = $row['name']; 
} 

print_r($sql.implode(',', $sqlRows)); // QUERY SQL 
print_r($bind);       // QUERY PARAMS 
+0

Спасибо! Работает очень хорошо :) – Tim

Смежные вопросы