Тот же ответ, что и г-н Балагтас, немного яснее ...
Последние версии MySQL и PHP PDO поддерживают многострочные INSERT
операторы.
SQL будет выглядеть примерно так: предположим, что таблица с тремя столбцами вы хотите INSERT
.
INSERT INTO tbl_name
(colA, colB, colC)
VALUES (?, ?, ?), (?, ?, ?), (?, ?, ?) [,...]
ON DUPLICATE KEY UPDATE
работает так, как ожидалось, даже с несколькими строками ВСТАВИТЬ; добавьте это:
ON DUPLICATE KEY UPDATE colA = VALUES(colA), colB = VALUES(colB), colC = VALUES(colC)
Ваш PHP-код будет следовать обычным вызовам PDO $pdo->prepare($qry)
и $stmt->execute($params)
.
$params
будет быть 1-мерным массивом всех значений, которые нужно передать в INSERT
.
В приведенном выше примере он должен содержать 9 элементов; PDO будет использовать каждый набор из 3 как одну строку значений. [Вставка 3 строк по 3 столбца каждый = 9 элементов массива.)
Ниже код написан для ясности, а не эффективности. Работайте с функциями PHP array_*()
для лучшего способа отображения или просмотра ваших данных, если хотите.
Предполагая:
$tblName
- имя строки таблицы INSERT для $colNames
- 1-мерный массив имен столбцов таблицы. Эти имена столбцов должны быть действительными идентификаторами столбцов MySQL; избегать их с обратными шагами (``), если они не $dataVals
- mutli-мерный массив, где каждый элемент представляет собой 1-й массив строки значений INSERT // setup data values for PDO
// memory warning: this is creating a copy all of $dataVals
$dataToInsert = array();
foreach ($dataVals as $row => $data) {
foreach($data as $val) {
$dataToInsert[] = $val;
}
}
// (optional) setup the ON DUPLICATE column names
$updateCols = array();
foreach ($colNames as $curCol) {
$updateCols[] = $curCol . " = VALUES($curCol)";
}
$onDup = implode(', ', $updateCols);
// setup the placeholders - a fancy way to make the long "(?, ?, ?)..." string
$rowPlaces = '(' . implode(', ', array_fill(0, count($colNames), '?')) . ')';
$allPlaces = implode(', ', array_fill(0, count($dataVals), $rowPlaces));
$sql = "INSERT INTO $tblName (" . implode(', ', $colNames) .
") VALUES " . $allPlaces . " ON DUPLICATE KEY UPDATE $onDup";
// and then the PHP PDO boilerplate
$stmt = $pdo->prepare ($sql);
try {
$stmt->execute($dataToInsert);
} catch (PDOException $e){
echo $e->getMessage();
}
$pdo->commit();