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

PHP & Base de données Discussion :

Vérifier si la ligne existe en base avant insertion [PDO]


Sujet :

PHP & Base de données

  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 Vérifier si la ligne existe en base avant insertion
    Bonsoir

    merci encore une fois pour vos retours que je vais essayer de m'approprier.

    J'aimerai vous soumettre un point de blocage. Celui de contrôler via une requête SQL si un enregistrement (sur la base de 3 champs) existe déjà.

    Cette requete me permet simplement d'insérer un contact. Tout fonctionne normalement
    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
     
      public function create(Contact &$contact)
      {
           $this->pdoStatement = $this->pdo->prepare('INSERT INTO contact VALUES (NULL, :nom, :prenom, :tel, :mel)');
     
        // 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();
     
     
        // 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; 
         }
      }

    CELIRA m'avait proposé une requête SQL que j'avais adapté pour vérifier si un enregistrement existait déjà sur la base de 3 champs renseignés à l'identique. Tout fonctionne parfaitement également.

    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
     
     
    $nom = $_POST['nomF'];
    $prenom = $_POST['prenomF'];
    $date = $_POST['dateN'];
    $ville = $_POST['villeN'];
     
    $req = $bdd->prepare('INSERT INTO t_doublon(nomF, prenomF, dateN, villeN) SELECT :nomF, :prenomF, :dateN, :villeN FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM t_doublon WHERE nomF=:nomF AND prenomF=:prenomF and dateN=:dateN)');
     
    $req->execute(array(
    'nomF' => $nom,
    'prenomF' => $prenom, 
    'dateN' => $date,
    'villeN' => $ville
    ));	
     
     
    if($req->rowCount() == 0){
    echo "Ce joueur est déjà enregistré !";
    }else {
    echo "Inscription effectuée";
    }
    j'aimerai maintenant la même chose en POO mais je ne sais pas où je commets mon erreur. Certainement la requête SQL....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $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)');
    j'ai essayé beaucoup de chose mais je ne trouve pas.....j'aimerai également réinsérer un message pour alerter l'utilisateur.
    Est-ce que ce fait bien dans la class ContactManager.php ?

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    La solution que tu proposes me semble bien compliqué.

    A partir du moment ou ta table à les contraintes d'unicité suffisante , il suffit de procéder à une insertion classique et de gérer l'erreur qui sera retourné si l'enregistrement que tu essai d'insérer rentre en collision avec un déjà existant.

    Quelque chose comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $prep= $bdd->prepare('...')
    try {
       $prep->execute(array('...'));
       // Insertion réussi , on fait ce qu'on à faire
    } catch (PDOException $e) {
       if ($e->errorInfo[1] == 1062) { //1062 correspond à une entrée dupliquée
          //Faire quelque chose dans le cas d'une entrée dupliquée
       } else {
          // une autre erreur
       }
    }
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  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

    En effet l’idee De contrainte d’unicite Sur 3 tuples en même temps me semble être parfaite mais avez vous des ressources ou un exemple concret car je ne connais pas du tout

    Merci

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Tu veux dire une contrainte d'unicité sur 3 colonnes ? ça se construit exactement comme une contrainte sur une colonne, sauf qu'on en utilise 3
    Par exemple :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE t_ex(
        col1 INT NOT NULL,
        col2 DATE NOT NULL,
        col3 INT NOT NULL,
        col4 INT NOT NULL,
        PRIMARY KEY(col1, col2, col3),
        UNIQUE KEY(col2, col4)
    )
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  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 vos infos,

    en bidouillant dans ma bdd, j'ai fini par trouver comment créer une contrainte d'unicité sur 3 tuples en même temps.
    Après de très nombreux tests, j'y suis arrivé. tout à l'air de bien fonctionner.

    PAr contre, en reprenant le code proposé pour capter une exception, j'ai tenté de faire apparaître un message d'erreur stipulant que l'enregistrement existait déjà mais sans succès ? par contre lorsque je regarde dans ma base de données, mysql fait bien son travail, il refuse l'enregistrement d'un même contact (à partir des 3 tuples).


    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
    56
    57
    58
    59
    60
     
    <?php
     
    try
    {
    	$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
    }
    catch(Exception $e)
    {
            die('Erreur : '.$e->getMessage());
    }
     
    {
    	//print_r('ok connexion réussie'); // juste pour moi pour vérifier que l'on accède à la base de données
    }
     
     
    $nom1 = $_POST['nomF'];
    $prenom1 = $_POST['prenomF'];
    $date1 = $_POST['dateN'];
    $ville1 = $_POST['villeN'];
     
     
    $req= $bdd->prepare('INSERT INTO t_doublon(nomF, prenomF, dateN, villeN) VALUES (:nomF, :prenomF, :dateN, :villeN)');
     
    try
    	{
    	   $req->execute(array(
    		'nomF' => $nom1,
    		'prenomF' => $prenom1, 
    		'dateN' => $date1,
    		'villeN' => $ville1
    	   ));
     
    	   // Insertion réussie , on fait ce qu'on à faire
    	   print_r ('insertion réussie');
     
    	}
    catch (Exception $e)
    	{
    	   if ($e->errorInfo[1] == 1062)
    		   { 
    		   //1062 correspond à une entrée dupliquée 
    		   //Faire quelque chose dans le cas d'une entrée dupliquée
     
                       print_r ('ce contact est déjà enregistré dans la base de données');
     
    		   } 
    	   else 
    		    {
    		     //
    			}
    	}
     
     
    //var_dump($nom1, $prenom1, $date1, $ville1);
     
    $req->closeCursor();
     
    ?>

    j'ai également essayé un die sans succès. on dirait qu'il n'arrive pas à tester la condition ?

  6. #6
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Est ce que tu rentre dans le catch déjà où alors sa t'affiche "Insertion réussie" ?

    Si tu es dans le catch que donne un var_dump($e); ?
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Attention, par défaut PDO est muet sur les erreurs. Si tu veux avoir des exceptions, il faut le préciser à la connexion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  8. #8
    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
    Super tout semble très bien marcher

    En effet, PDO n'est plus muet maintenant. Je pense avoir compris le principe de fonctionnement.

    Merciiiiiiii


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

Discussions similaires

  1. [MySQL] Vérifier si un ligne existe déjà dans la base de données avant l'insertion
    Par moukit233 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 11/08/2009, 12h35
  2. [MySQL] verifier si les infos existe en base avant insertion
    Par fey dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 23/01/2008, 19h30
  3. [MySQL] Vérifier l'existance d'une donnée dans la base avant insertion
    Par Him dans le forum PHP & Base de données
    Réponses: 26
    Dernier message: 16/07/2006, 15h47
  4. vérifier si une ligne existe, et lister les champs
    Par AIexis dans le forum Débuter
    Réponses: 15
    Dernier message: 27/12/2005, 21h06
  5. Oracle 9i : Vérifier qu'une ligne existe
    Par Fatah93 dans le forum Oracle
    Réponses: 4
    Dernier message: 14/06/2005, 12h27

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