PDO - requête d'insertion multiple qui ne fonctionne pas
Bonjour,
Malgré chatGPT et toutes les ressources d'aujourd'hui, je me confronte à un problème que je n'arrive pas à résoudre dans une requête SQL où j'essaie de faire plusieurs insertions d'un coup.
Ce code fonctionne très bien :
Code:
1 2 3 4 5 6 7 8 9 10
|
$sql = "INSERT INTO postcondition (description, id_user) VALUES (:description, :id_user)";
$stmt = $this->db->prepare($sql);
$stmt->execute([
'description' => $postCondition->getDescription(),
'id_user' => $postCondition->getUser()->getId()
]);
$postCondition->setId($this->db->lastInsertId());
return $postCondition; |
Sauf que des postconditions, j'en ai plusieurs, et jusqu'à présent, j'exécutais donc ce code dans un foreach. Je multipliais donc les requêtes à la base de données. Dans un soucis de performances, j'ai eu envie de faire une seule requête, qui intègre toutes les lignes d'un coup.
J'ai donc revu mon code, de cette manière :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
$sql = "INSERT INTO postcondition (description, id_user) VALUES ";
$i = 0;
$data = [];
foreach ($postConditions as $postCondition) {
$sql .= " (:description" . $i . ", :id_user" . $i . "),";
$data['description' . $i] = $postCondition->getDescription();
$data['id_user' . $i] = $postCondition->getUser()->getId();
$i++;
}
$sql = substr($sql, 0, -1);
$stmt = $this->db->prepare($sql);
$stmt->execute($data); |
Le résultat de la concaténation est le suivant :
Code:
'INSERT INTO us_precondition (description, id_user) VALUES (:description0, :id_user0), (:description1, :id_user1)'
Si je le prends tel quel et que je remplace à la main les valeurs, que je tente dans phpmyadmin de 'insérer, ça marche.
Mais PDO me répond "Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de '('avec un tiret au début.', '41')' à la ligne 1", et précise que c'est la ligne $stmt->execute($data); qui lève l'erreur. Pourtant voici le debug :
Code:
1 2
|
execute( $params = ['description0' => 'Indiquer une ligne par condition,', 'id_user0' => 42, 'description1' => 'avec un tiret au debut.', 'id_user1' => 42] ) |
J'ai également essayé de faire un entre deux :
Code:
1 2 3 4 5 6 7 8 9
|
$sql = "INSERT INTO postcondition (description, id_user) VALUES (:description, :id_user)";
$stmt = $this->db->prepare($sql);
foreach ($postConditions as $postCondition) {
$stmt->execute([
'description' => $postCondition->getDescription(),
'id_user' => $postCondition->getUser()->getId()
]);
} |
Et cela fonctionne. Mais pour moi, cela revient au même que ma situation actuelle, c'est-à-dire que je fais plusieurs petits appels à la base de données, plutôt qu'une seul plus conséquent.
Je ne comprends pas d'où vient le problème, on ne peut pas faire de requête multiple avec PDO ?