与巴拉格塔斯先生相同的答案,稍微清晰一些......
最新版本的MySQL和PHP PDO支持多行语句。INSERT
SQL 概述
SQL 将如下所示,假设您想要一个 3 列表。INSERT
INSERT INTO tbl_name
(colA, colB, colC)
VALUES (?, ?, ?), (?, ?, ?), (?, ?, ?) [,...]
ON DUPLICATE KEY UPDATE
即使使用多行 INSERT 也能按预期工作;附加以下内容:
ON DUPLICATE KEY UPDATE colA = VALUES(colA), colB = VALUES(colB), colC = VALUES(colC)
菲律宾比索概述
您的 PHP 代码将遵循通常的 PDO 调用。$pdo->prepare($qry)
$stmt->execute($params)
$params
将是要传递给 的所有值的一维数组。INSERT
在上面的例子中,它应该包含9个元素;PDO 将使用每组 3 作为单行值。(插入 3 行,每行 3 列 = 9 个元素数组。
实现
下面的代码是为了清晰而写的,而不是为了效率。如果您愿意,可以使用PHP函数以更好的方式映射或浏览数据。是否可以使用事务显然取决于您的MySQL表类型。array_*()
若:
-
$tblName
- 要插入到的表的字符串名称
-
$colNames
- 表的列名的一维数组 这些列名必须是有效的MySQL列标识符;如果它们不是,则使用反引号 ('') 将其转义
-
$dataVals
- 多维数组,其中每个元素都是 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);
$stmt->execute($dataToInsert);
$pdo->commit();