Ca pue les injections SQL et autres plantages sur ' ...
Bref, il manque une contrainte unique avant tout si tu ne veux pas de "doublon". Ensuite, on ne sait pas quel SGBD tu utilises, on va supposer MySQL, si tu veux ignorer les doublons, tu as l'option IGNORE (INSERT IGNORE ...) mais :
ça requiert la contrainte susmentionnée
un doublon incrémentera "gratuitement" l'auto-incrément (si la table en dispose d'un). Si c'est un inconvénient, on s'orientera plutôt vers une réécriture de la requête en un INSERT ... SELECT avec une clause WHERE de type WHERE NOT EXISTS
Bonjour, je travail sur un projet ou je suis amené a ajouter des données dans la basse de donnée
or j'aimerais que si les données envoyées sont déjà présente quelle ne le soit pas avec un petit message.
actuellement j'envois les donnée avec cette requête
$sql = "INSERT INTO $LettreX (TITRE, DEFINITION) VALUES ('$Titre', '$Definition')";
tout ce passe bien mais j'ai des doublons
Si il y a des doublons, et que tu viens nous dire qu'il y a des doublons alors que tu n'en veux pas, on va pas dire que "ça se passe bien".
Bon, reprenons calmement : la base de données. PHP, c'est une autre histoire.
Tu nous parles d'une table avec deux colonnes (au moins), titre et définition. Mais tu ne nous dis pas comment elle est définie exactement. Bref, on parle en l'air.
Essayons avec sqlite
1. sans clés, ni contraintes
La définition de la table
CREATE TABLE "lexique" (
"titre" TEXT NOT NULL,
"definition" TEXT NOT NULL
);
et on exécute ça :
insert into lexique (titre, definition)
values ("t1", "d1");
insert into lexique (titre, definition)
values ("t2", "d2");
insert into lexique (titre, definition)
values ("t2", "d3");
select * from lexique;
Ca nous ramène trois enregistrements
t1 d1
t2 d2
t2 d3
On suppose que ce que appelles "les doublons", c'est quand il y a deux fois (ou plus) le même titre ?
2. Le moyen le plus direct pour éviter, c'est de dire que la table n'a jamais deux fois la même valeur de titre. On va revoir la structure de la table, pour faire de titre une clé primaire (ce qui facilitera les recherches, par ailleurs).
On jette la table, et on recommence
CREATE TABLE "lexique" (
"titre" TEXT NOT NULL,
"definition" TEXT NOT NULL,
PRIMARY KEY("titre")
);
en lançant les mêmes insertions, on se fait jeter pour la 3ieme
L'exécution s'est terminée avec des erreurs.
Résultat : UNIQUE constraint failed: lexique.titre
À la ligne 6 :
insert into lexique (titre, definition)
values ("t2", "d3");
Donc il suffit de tenter l'insertion, et si ça échoue, ben voila.
3. Si on voulait que ça remplace, c'est l'instruction INSERT OR REPLACE
delete from lexique;
insert or replace into lexique (titre, definition)
values ("t1", "d1");
insert or replace into lexique (titre, definition)
values ("t2", "d2");
insert or replace into lexique (titre, definition)
values ("t2", "d3");
select * from lexique;
qui retourne
t1 d1
t2 d3
Avec d'autres bases de données, c'est INSERT into ..... ON DUPLICATE KEY UPDATE...
Faut lire le manuel.
PS: se méfier des réponses avec du code manifestement non testé. "NOT EXSITS", ça n'existe pas.
- Edité par michelbillaud 11 juillet 2023 à 14:22:58
> PS: se méfier des réponses avec du code manifestement non testé. "NOT EXSITS", ça n'existe pas.
Franchement t'exagères, tu me reproches une typo alors que je l'ai bien écrit le post d'avant sans compter que ça paraît assez évident et, oui, je ne l'ai pas testé, pas plus que le PO n'a fait l'effort de tester la sienne (INSERT/VALUE avec WHERE ça m'étonnerait que ça fonctionne mieux) ou de prendre en compte ce que je lui avais répondu juste avant.
EDIT : en fait, ce n'est même pas moi qui l'ai mal écrit au départ, j'ai repris la sienne ...
> Avec d'autres bases de données, c'est INSERT into ..... ON DUPLICATE KEY UPDATE...
> PS: se méfier des réponses avec du code manifestement non testé. "NOT EXSITS", ça n'existe pas.
Franchement t'exagères, tu me reproches une typo alors que [etc]
Je suis surtout très méfiant sur du code qui n'a pas été testé, donné en réponse à une question mal définie, pour laquelle on ne sait pas clairement si il faut
faire un update quand la clé existe
ou refuser l'ajout
La typo, ça révèle juste que la solution proposée n'a pas été testée. On peut être sûr de soi sur le principe, mais le diable se cache dans les détails, comme on dit.
- Edité par michelbillaud 11 juillet 2023 à 15:54:34
Envoyer les données que si elle n'existe pas
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli