J'ai une table qui contient des fruits, identifiés de 1 à 4
J'ai une autre table des achats, qui référence les fruits, avec contrainte de clef étrangère
Je tente ensuite d'insérer un bloc d'achats de fruits.
Problème, le bloc (de plusieurs centaines d'achats, en réalité) contient une référence d'un fruit inexistant.
Comment trouver, avec PHP et PDO, la clef étrangère incorrecte ?
Jusqu'à présent, PHP me permet d'obtenir le code d'erreur 1452, mais pas le fruit 5.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 DROP DATABASE IF EXISTS fruits; CREATE DATABASE fruits CHARACTER SET 'utf8'; USE fruits; CREATE TABLE t_fruits ( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, nom VARCHAR(15) NOT NULL ) ENGINE=InnoDB, COMMENT 'Tous les fruits' ; CREATE TABLE t_achats ( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, jour DATE NOT NULL, fruit INT UNSIGNED NOT NULL, montant NUMERIC(8, 2) NOT NULL, CONSTRAINT achatFruit FOREIGN KEY(fruit) REFERENCES t_fruits(id) ON DELETE CASCADE ) ENGINE=InnoDB, COMMENT 'Achats de fruits' ; SHOW TABLES; INSERT INTO t_fruits VALUES (NULL, 'Poire'), (NULL, 'Pomme'), (NULL, 'Cerise'), (NULL, 'Fraise') ; SELECT * FROM t_fruits; INSERT INTO t_achats VALUES (NULL, CURRENT_DATE, 1, 15.2), (NULL, CURRENT_DATE, 2, 20.3), (NULL, CURRENT_DATE, 3, 10.45), (NULL, CURRENT_DATE, 5, 10.22), -- Fruit 5 n'existe pas (NULL, CURRENT_DATE, 4, 17.25), (NULL, CURRENT_DATE, 1, 8.52) ; SELECT * FROM t_achats ORDER BY id; SELECT 'Comment obtenir, en PHP avec PDO, la clef problématique (le fruit 5) ?' AS question;
Si je pouvais l'obtenir, ça me permettrait d'éviter de programmer une solution lourde, telle que découper ma requête insert en autant de requêtes qu'elle contient de lignes.
Et tester le résultat après chaque mini-requête d'une ligne.
Car ma requête d'insertion d'achats provient d'une requête Ajax, depuis un client web, qui me balance, en un JSON, un tableau de tous ses achats de fruits.
Je convertis le tableau en une requête SQL, et l'exécute d'un bloc de plusieurs centaines d'achats.
Problème, si le tableau JSON contient un fruit 5 inconnu, toute la requête échoue. Aucun achat ne passe.
Si PDO pouvait me dire que la requête a échoué, à cause du fruit inconnu 5, je pourrais répondre toujours en Ajax, à mon client "fruit 5 inconnu"
Le client omettrait le fruit 5 de sa liste d'achats, et recommencerait la requête Ajax.
Et ce,en boucle, jusqu'à ce que sa liste d'achats ne contienne plus de fruits inconnus, et que mon INSERT multiple réussisse.
Auquel cas, je lui renvoie un code contenant le nombre d'achats insérés sur la BD du serveur.
Si le nombre d'achats insérés sur la BD du serveur correspond au nombre d'achats envoyés, alors, le client peut les effacer, le serveur les a bien reçus.
Sinon, c'est qu'il y a encore eu une erreur, par exemple sur un autre fruit inconnu t_achats.fruit=9
Auquel cas, on recommence la boucle: Fruit inconnu 9
Que le client est prié d'effacer de sa liste, avant de la renvoyer au serveur, etc...
Ma question est comment obtenir, en PHP, grâce à PDO, la valeur de la foreign key qui enfreint la contrainte ?
Merci,
Christian.
Partager