Même réponse que M. Balagtas, légèrement plus claire...
Versions récentes de MySQL et PHP PDO faire supporter plusieurs rangées INSERT
déclarations.
Aperçu de SQL
Le SQL ressemblera à quelque chose comme ceci, en supposant un tableau à 3 colonnes que vous souhaitez INSERT
à.
INSERT INTO tbl_name
(colA, colB, colC)
VALUES (?, ?, ?), (?, ?, ?), (?, ?, ?) [,...]
ON DUPLICATE KEY UPDATE
fonctionne comme prévu, même avec un INSERT à plusieurs rangs ; ajoutez ceci :
ON DUPLICATE KEY UPDATE colA = VALUES(colA), colB = VALUES(colB), colC = VALUES(colC)
Présentation de PHP
Votre code PHP suivra le schéma habituel $pdo->prepare($qry)
et $stmt->execute($params)
Appels PDO.
$params
sera un tableau unidimensionnel de tous les valeurs à transmettre à la INSERT
.
Dans l'exemple ci-dessus, il devrait contenir 9 éléments ; PDO utilisera chaque ensemble de 3 comme une seule ligne de valeurs. (Insertion de 3 rangées de 3 colonnes chacune = tableau de 9 éléments).
Mise en œuvre
Le code ci-dessous est écrit pour la clarté, pas pour l'efficacité. Travaillez avec le PHP array_*()
des fonctions pour de meilleures façons de cartographier ou de parcourir vos données si vous le souhaitez. La possibilité d'utiliser des transactions dépend évidemment du type de votre table MySQL.
Assumant :
-
$tblName
- le nom en chaîne de la table à INSÉRER
-
$colNames
- Tableau unidimensionnel des noms de colonnes de la table. Ces noms de colonne doivent être des identifiants de colonne MySQL valides ; échappez-les avec des barres obliques inversées (``) s'ils ne le sont pas.
-
$dataVals
- tableau mutli-dimensionnel, où chaque élément est un tableau 1-d d'une rangée de valeurs à INSÉRER
Exemple de code
// 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();
0 votes
Prudent avec beaucoup de réponses pour
$stmt->execute($data);
php.net/manual/en/ En fait, tous les paramètres sont validés en tant que chaînes de caractères. Il suffit de boucler sur les données après avoir construit la requête, et manuellementbindValue
oubindParam
en passant le type comme troisième argument.