IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Tester si un enregistrement existe déjà


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Points : 121
    Points
    121
    Par défaut Tester si un enregistrement existe déjà
    Bonjour,

    J'utilse la POO et mySQL.

    Je suis novice mais grâce aux tutoriels, j'ai réussi à créer une class Contact + class ContactManager qui reprend simplement le CRUD...

    J'ai un formulaire Contact qui comprend 5 champs par exemple
    - id
    - nom
    - prenom
    - tel
    - mel

    Je cherche une requête SQL qui me permet de "tester" si un contact existe déjà dans ma base de données SUR LA BASE DE 3 CHAMPS par exemple :

    SQL =
    nom saisie dans le formulaire = nom existant dans ma base de données
    AND
    prenom saisie dans le formulaire = prenom existant dans ma base de données
    AND
    mel saisie dans le formulaire = mel existant dans ma base de données


    si 3 correspondances existent alors interdire enregistrement sinon ok.

    Nb : j'ai déjà réalisé une ajax qui informe l'utlisateur après avoir renseigné ces 3 champs qu'un même contact existe déjà. Mais sauf erreur de ma part, un expert pourrait la contourner facilement.

    Je cherche donc un moyen côté serveur de recontrôler cette information.

    je vous laisse mon code pour être plus clair.

    Code php : 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
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
       /**
        *  insertion d'un  objet Contact dans la base de données + met à jour l'objet en argument en lui spécifiant un identifiant. 
        *  @param de type Contact dans une variable $contact  passé par référence.
        *  return bool true si l'objet a été inséré, false si erreur survient 
        */
      public function create(Contact &$contact)
      {
     
        $this->pdoStatement = $this->pdo->prepare('INSERT INTO contact VALUES (NULL, :nom, :prenom, :tel, :mel)');  // cela marche bien mais ne contrôle pas ce que je veux
     
    /* .... cette requete avec du code en procédural marche très bien 
    $req = $bdd->prepare('INSERT INTO contact(nom, prenom, tel, mel) SELECT :nom, :prenom, :tel, :mel FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM contact WHERE nom=:nom AND prenom=:prenom and tel=:tel)');*/
     
     
        // j'ai essayé d'adapter cette requete mais bien sur cela ne marche pas.....
       /*  $this->pdoStatement = $this->pdo->prepare('INSERT INTO contact VALUES (NULL, :nom, :prenom, :tel, :mel) SELECT :nom, :prenom, :tel, :mel FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM contact WHERE nom=:nom AND prenom=:prenom and tel=:tel)');*/
     
        // on lie les variables et on utilise les getters pour obtenir les données 
        $this->pdoStatement->bindValue(':nom', $contact->getNom(), PDO::PARAM_STR);
        $this->pdoStatement->bindValue(':prenom', $contact->getPrenom(), PDO::PARAM_STR);
        $this->pdoStatement->bindValue(':tel', $contact->getTel(), PDO::PARAM_STR);
        $this->pdoStatement->bindValue(':mel', $contact->getMel(), PDO::PARAM_STR);
     
     
        //execute la requete préparée et on recupére l'objet pour pouvoir le tester
        $executeIsOK = $this->pdoStatement->execute();
     
     
        $count = $this->pdoStatement->rowCount();
     
        // juste pour contrôler pour moi
        if($count>1)
        {
          print("Ce contact existe déjà"); // => refuser l'enregistrement dans la base de données
        }
        else {
          print("ok pour l'enregistrement"); // autoriser enregistrement dans la base de données
        }
     
     
        // on teste le retour de la requete conformément à la documentation ci-dessus : true = si tout s'est bien passé ou false s'il y a une erreure
        if(!$executeIsOK)
          {
          return false;
          } 
        else
         {
          // pour la mise à jour de l'insertion  
          $id = $this->pdo->lastInsertId(); // on récupère l'identifiant de l'objet créé
          $contact = $this->read($id); // affectation de l'id à l'objet créé
     
          return true; 
         }
      }

    En résumé, je cherche une requête SQL qui me permettrait au préalable de vérifier si un contact (sur la base de 3 champs distincts) existe déjà dans ma base de données ?
    Est-ce possible ou fais-je fausse route ?
    merci pour vos retours;

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Si dans ta table contact il ne peut y avoir deux personnes avec les mêmes nom, prénom et mel, alors tu peux mettre dans ta table une contrainte d'unicité sur le triplet. Du coup, l'insert fait depuis ton application planterait, mais un insert fait directement dans mySql aussi.
    Cordialement
    Soazig

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Points : 121
    Points
    121
    Par défaut
    Merci pour l'information...je ne connais pas avez-vous un exemple ou un tuto, articles pour illustrer...je vais chercher de mon côté

    Est-il possible de renvoyer un message ou une erreur à l'utilisateur avec cette approche

  4. #4
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut bricoreur .

    La contrainte d'unicité se fait à l'aide d'un "index unique" sur vos trois colonnes.
    --> https://dev.mysql.com/doc/refman/8.0...ate-index.html

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE UNIQUE INDEX `idx` USING BTREE ON `test` (`col1`,`col2`);
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Points : 121
    Points
    121
    Par défaut
    MErci pour votre réponse

    je ne m'y connais pas plus que cela en base de données. je sais créer un table + faire quelques jointures via SQL mais ce que vous me proposez depasse mes compétences.

    j'ai bien lu la documentation liée au lien que vous m'avez proposé. je pense en avoir compris les grande lignes. Mais je ne sais pas comment l'exploiter.

    Faut-il l'insérer en plus dans ma bdd (test /phpmyadmin) dans la partie SQL ?

    par exemple si j'ai une table contact avec 6 champs

    - id
    - nom
    - prenom
    - date
    - tel
    - mail

    et que je veux une contrainte d'unicité sur 3 tuples (nom + prenom + date) .
    Pour confirmation : l'unicité concerne bien un enregistrement sur les 3 tuples (en même temps). Exemple :

    - dupont dupont 01/01/0001 => ok
    - dupont dupont 02/02/002 => ok
    - dupont pierre 01/01/001 => ok

    - dupont dupont 01/01/0001 => refusé car l'enregistrement existe déjà.
    La contrainte d'unicité sur les 3 tuples revient bien à faire cela ?


    Si tel est bien le cas, comment exploiter votre proposition :

    CREATE UNIQUE INDEX `idx` USING BTREE ON `contact` (`nom`,`prenom`, `date` ); ?? est-ce correct

    avez vous un exemple concret

    merci d'avance pour votre aide

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Points : 121
    Points
    121
    Par défaut
    j'ai réussi à créer une contrainte d'unicité sur 3 tuples.

    pour ceux qui cherchent comme moi sur phpmyadmin

    il suffit de cliquer sur index, choisir unique et attribuer un nom
    puis recommencer l'opération sur les tuples que l'on souhaite associer au critètre d'unicite.
    Phpmyadmin propose alors d'associer ou non le critère d'unicité à d'autres tuples. Il suffit de choisir ce que l'on veut

    Merci pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [LibreOffice][Tableur] Tester Enregistrement existe déjà dans BDD
    Par Mytå_Qc dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 13/02/2013, 12h01
  2. Réponses: 2
    Dernier message: 14/12/2012, 12h42
  3. Tester si un enregistrement existe
    Par helpcomm dans le forum PL/SQL
    Réponses: 3
    Dernier message: 01/09/2011, 11h56
  4. Tester si un enregistrement existe déjà en table
    Par qmike dans le forum Langage
    Réponses: 11
    Dernier message: 13/10/2009, 16h10
  5. [langage] tester si un fichier existe
    Par schnecke dans le forum Langage
    Réponses: 3
    Dernier message: 02/03/2004, 11h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo