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 :
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
J'ai donc revu mon code, de cette manière :
Le résultat de la concaténation est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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);
Si je le prends tel quel et que je remplace à la main les valeurs, que je tente dans phpmyadmin de 'insérer, ça marche.
Code : Sélectionner tout - Visualiser dans une fenêtre à part 'INSERT INTO us_precondition (description, id_user) VALUES (:description0, :id_user0), (:description1, :id_user1)'
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 :
J'ai également essayé de faire un entre deux :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 execute( $params = ['description0' => 'Indiquer une ligne par condition,', 'id_user0' => 42, 'description1' => 'avec un tiret au debut.', 'id_user1' => 42] )
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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() ]); }
Je ne comprends pas d'où vient le problème, on ne peut pas faire de requête multiple avec PDO ?
Partager