Partage
  • Partager sur Facebook
  • Partager sur Twitter

Envoyer les données que si elle n'existe pas

    8 juillet 2023 à 16:45:20

    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 :(

    Bon week-end a tous 


    -
    Edité par nathann60 8 juillet 2023 à 16:47:23

    • Partager sur Facebook
    • Partager sur Twitter
      8 juillet 2023 à 23:29:11

      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 :

      1. ça requiert la contrainte susmentionnée
      2. 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
      • Partager sur Facebook
      • Partager sur Twitter
        9 juillet 2023 à 12:34:44

        Bonjour, merci pour ta réponse, 

        j'ai donc regarder les 

        WHERE NOT EXISTS

        j'ai fait un truc comme ça et évidement cela ne fonctionne pas, o_O

        INSERT INTO LEXIQUE_A( TITRE, DEFINITION ) VALUE(
        'test',
        'test'
        )
        WHERE NOT EXSITS(
        
        SELECT TITRE
        FROM LEXIQUE_A
        WHERE TITRE = 'test'
        )



        • Partager sur Facebook
        • Partager sur Twitter
          9 juillet 2023 à 13:46:52

          Non, plutôt :

          INSERT INTO LEXIQUE_A(TITRE, DEFINITION)
          SELECT 'test', 'test'
          WHERE NOT EXISTS(
               SELECT TITRE
               FROM LEXIQUE_A
               WHERE TITRE = 'test'
          )
          ;
          

          EDIT : correction du EXSITS en EXISTS

          -
          Edité par julp 11 juillet 2023 à 14:52:41

          • Partager sur Facebook
          • Partager sur Twitter
            11 juillet 2023 à 14:16:26

            nathann60 a écrit:

            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

            • Partager sur Facebook
            • Partager sur Twitter
              11 juillet 2023 à 14:49:28

              > 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...

              C'est propre à MySQL.

              -
              Edité par julp 11 juillet 2023 à 14:51:10

              • Partager sur Facebook
              • Partager sur Twitter
                11 juillet 2023 à 15:49:42

                julp a écrit:

                > 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

                • Partager sur Facebook
                • Partager sur Twitter

                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.
                • Editeur
                • Markdown