Несовместимость версий Newtonsoft Json.NET (ад ​​DLL)

Тот же ответ, что и г-н Балагтас, немного яснее ...

Последние версии MySQL и PHP PDO поддерживают многострочные INSERT операторы.

Обзор SQL

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

Ваш 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();
21
задан Falco Alexander 11 January 2019 в 14:03
поделиться