Partage
  • Partager sur Facebook
  • Partager sur Twitter

[PDO] Erreur de contrainte Clé Etrangère

problème suite à passage MVC.

Sujet résolu
    14 novembre 2019 à 12:30:41

    Bonjour,

    Je bascule doucement mon projet en MVC pour pouvoir mieux le maintenir par la suite et je ne comprends pas l'erreur que j'ai...

    Voici la partie du controler qui nous interesse :

    // On enregistre si besoin le visiteur
    $idVisiteur = getIDVisiteur($_POST['Nom'], $_POST['Prenom'], $idSociete);
    
    if (is_null($idVisiteur)) {
        addVisiteur ($idSociete, strtoupper($_POST['Nom']), $_POST['Prenom']);
        $idVisiteur = getIDVisiteur($_POST['Nom'], $_POST['Prenom'], $idSociete);
    }
    
    // On enregistre le lien type de visiteur - visiteur si besoin
    $idTypeVisiteur = getIDTypeVisiteur($_POST['type_personnel']);
    $lienTypeVisiteur = getLienTypeVisiteur($idVisiteur, $idTypeVisiteur);
    if (is_null($lienTypeVisiteur)) {
        addLienVisiteurType ((int)$idVisiteur, (int)$idTypeVisiteur);
        $lienTypeVisiteur = getLienTypeVisiteur($idVisiteur, $idTypeVisiteur);
    }

    Et voici la fonction du modèle qui nous interesse :

    function addLienVisiteurType ($pIDTypeVisiteur, $pIDVisiteur)
    {
        $dataBase = DBConnect();
        $requete = $dataBase->prepare(
            'INSERT INTO t_lien_visiteur_type (ID_Type_Visiteur, ID_Visiteur) VALUES (:idType, :idVisiteur)'
        );
        
        $requete -> execute(array('data0' => $pIDTypeVisiteur, 'data1' => $pIDVisiteur));
        
    }

    La Table t_lien_visiteur_type contient que ces 2 champs là qui sont des clés étrangèe d'autre tables (c'est une table de liaison, d'où son nomà

    Dans mon controler, toutes les variables du post sont initialisé, le visiteur est ajouté à la base de données et l'idTypeDeVisiteur a bien une valeur existante... Cependant voici le message que j'ai :

    Fatal error: Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`registre_visiteur_v2`.`t_lien_visiteur_type`, CONSTRAINT `t_lien_visiteur_type_ibfk_1` FOREIGN KEY (`ID_Visiteur`) REFERENCES `t_visiteur` (`ID_Visiteur`)) in C:\wamp64\www\Registre_Visiteurs\Registre des visiteurs - Classe\Model\Model.php:258 Stack trace: #0 C:\wamp64\www\Registre_Visiteurs\Registre des visiteurs - Classe\Model\Model.php(258): PDOStatement->execute(Array) #1 C:\wamp64\www\Registre_Visiteurs\Registre des visiteurs - Classe\Controler\enregistrerDemande.php(24): addLienVisiteurType(62, 1) #2 {main} thrown in C:\wamp64\www\Registre_Visiteurs\Registre des visiteurs - Classe\Model\Model.php on line 258

    Je ne comprends pas.... Car la requête est exactement la même que dans le projet déjà existant et cela fonctionne...

    Si qqun peut m'aider svp...

    -
    Edité par lindadu01 14 novembre 2019 à 12:32:01

    • Partager sur Facebook
    • Partager sur Twitter

    Parfois, arrêter 5 minutes son développement permet de mieux repartir face à un problème ;)

      14 novembre 2019 à 12:39:53

      Salut,

      • afin d'éviter les requêtes superflues, tu devrais lire la doc de PDO::lastinsertid(),
      • pour ajouter des clé étrangères il faut que les données dans les tables maitres (PK) soient connues, est-ce le cas ?
      • Partager sur Facebook
      • Partager sur Twitter
        14 novembre 2019 à 13:06:19

        Bonjour,

        Merci de ta réponse.

        Je ne connais le lastinserid(), j'irai voir ca cet après midi ou après la mise en production lors de la phase d'optimisation et du passage en MVC avec des classes.

        Pour les clés étrangères, oui c'est le cas puisque si le visiteur n'existe pas, on le créé juste avant donc il existe forcement et pour le type de visiteur, il existe aussi, j'ai vérifié et dans la BDD et via un var dump (à l'affichage on affiche les champs directement mais je rajouterai une verification pour voir si on n'est pas aller modifier le nom du type et qu'il devient introuvable mais là n'est pas le problème actuel car les 2 valeurs existes...

        • Partager sur Facebook
        • Partager sur Twitter

        Parfois, arrêter 5 minutes son développement permet de mieux repartir face à un problème ;)

          14 novembre 2019 à 13:09:50

          il parle de la table t_visiteur, c'est là où tu insère le visiteur dans le premier IF ?
          • Partager sur Facebook
          • Partager sur Twitter
            14 novembre 2019 à 13:51:42

            Oui.

            Regarde la fonction :

            function addVisiteur ($pIDSociete, $pNomVisiteur, $pPrenomVisiteur) 
            {
                $dataBase = DBConnect();
                $requete = $dataBase->prepare(
                    'INSERT INTO t_visiteur (ID_Societe, Nom_Visiteur, Prenom_Visiteur) VALUES (:id, :nom, :prenom)'
                );
                
                $requete -> execute(array('id' => $pIDSociete, 'nom' => $pNomVisiteur, 'prenom' => $pPrenomVisiteur));
            }

            et $idVisiteur vaut ceci :

            string(2) "62"

            • Partager sur Facebook
            • Partager sur Twitter

            Parfois, arrêter 5 minutes son développement permet de mieux repartir face à un problème ;)

              14 novembre 2019 à 13:55:24

              T'aurais pas inversé les arguments ou les paramètres ?

              > function addLienVisiteurType ($pIDTypeVisiteur, $pIDVisiteur)

              pour

              > addLienVisiteurType ((int)$idVisiteur, (int)$idTypeVisiteur);

              Remarques :

              • tu pourrais utiliser le typehinting
              • dans ton premier post, le code de la fonction addLienVisiteurType, les marqueurs ne correspondent pas
              • pourquoi ne passes-tu pas la connexion PDO en arguments pour n'en établir/utiliser qu'une au lieu d'en recréer une à chaque appel de méthode :/

              -
              Edité par julp 14 novembre 2019 à 13:57:40

              • Partager sur Facebook
              • Partager sur Twitter
                14 novembre 2019 à 14:02:35

                julp a écrit:

                T'aurais pas inversé les arguments ou les paramètres ?

                > function addLienVisiteurType ($pIDTypeVisiteur, $pIDVisiteur)

                pour

                > addLienVisiteurType ((int)$idVisiteur, (int)$idTypeVisiteur);

                Remarques :

                • tu pourrais utiliser le typehinting
                • dans ton premier post, le code de la fonction addLienVisiteurType, les marqueurs ne correspondent pas
                • pourquoi ne passes-tu pas la connexion PDO en arguments pour n'en établir/utiliser qu'une au lieu d'en recréer une à chaque appel de méthode :/

                -
                Edité par julp il y a 3 minutes


                Merci Julp, je n'avais pas vu...

                Je regarderai qu'est-ce que le typehinting. Concernant la connexion PDO, c'est prévu (comme créer des classe aussi) que je le fasse mais disons que je dois faire rapidement et je prend le temps de bien comprendre le MVC avant de faire ca

                • Partager sur Facebook
                • Partager sur Twitter

                Parfois, arrêter 5 minutes son développement permet de mieux repartir face à un problème ;)

                [PDO] Erreur de contrainte Clé Etrangère

                × 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