Partage
  • Partager sur Facebook
  • Partager sur Twitter

jointure retourne false

Sujet résolu
    5 septembre 2019 à 2:01:16

    bonjour, au risque de me faire lyncher

    j'ai un problème dont je ne comprends pourquoi j'ai cette erreur ! 

    lors d'une requête avec jointure j'ai le résultat false 

    alors que sans la jointure j'ai bien un résultat

    voici le code sans jointure

    $req = $bdd -> prepare ('SELECT * FROM topics WHERE id_topic = :topic ');
    //					$req->bindValue(':topic', $_GET['topic'], PDO::PARAM_STR);
    					$req->execute();
    					$res = $req->Fetch(PDO::FETCH_ASSOC);
    					var_dump($res);

    VS 

    code avec jointure

    $req = $bdd -> prepare ('SELECT * FROM topics T NATURAL JOIN users WHERE T.id_topic=:topic ');
    //					$req->bindValue(':topic', $_GET['topic'], PDO::PARAM_STR);
    					$req->execute();
    					$res = $req->Fetch(PDO::FETCH_ASSOC);
    					var_dump($res);


    pour les infos des tables 

    table topic : id_topic (AI) , id_user(FK), topic 

    table users : id_user(AI,FK), nom(uniq), mail(uniq)

    j'ai également fait la manip avec un inner join, mais res est toujours false

    -
    Edité par born1 5 septembre 2019 à 3:39:39

    • Partager sur Facebook
    • Partager sur Twitter
      5 septembre 2019 à 9:45:53

      Bonjour,

      C'est en effet très étonnant ...

      Je suppose que la ligne commentée avec le bindValue c'est une erreur ... sinon ton code ne peut fonctionner, on est d'accord ?

      Après, si le bindValue est correct, la seule explication au fait que la jointure ne récupère aucun résultat c'est qu'il n'y a pas concordance des id_user entre les deux tables ...

      Vérifie (dans PHPMyAdmin par exemple) que dans la table topics, il y a bien des valeurs dans la colonne id_user (et pas des NULL).

      Si il y a des valeurs, vérifie que ces valeurs existent bien dans la table users.

      Si les valeurs présentent dans la table topics existent dans la table users, vérifie que les types de données des deux colonnes id_user sont les mêmes dans les deux tables ...

      Si toutes ces conditions sont réunies c'est ... impossible :p

      -
      Edité par Benzouye 5 septembre 2019 à 9:46:11

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        5 septembre 2019 à 12:45:53

        Alors le bindValue est en commentaire suite à différents essaies, en effet nous sommes d'accord.

        J'y ai pensé aussi, j'ai vérifié les valeurs  dans les tables, 

        De plus il s'agit d'une jointure, je suppose que si il n'y a pas de valeurs dans la table users, il ne la récupère pas, mais donnerait quand même les valeurs de la table topics, non ? 

        id_user est même en FK 

        -
        Edité par born1 5 septembre 2019 à 22:34:57

        • Partager sur Facebook
        • Partager sur Twitter
          5 septembre 2019 à 13:42:18

          born1 a écrit:

          si il n'y a pas de valeurs dans la table users, il ne la récupère pas, mais donnerait quand même les valeurs de la table topics, non ?

          Non ... pour avoir ce résultat il faut utiliser des jointures externes (LEFT ou RIGHT JOIN) ...

          D'ailleurs, si tu fais ceci :

          SELECT *
          FROM
          	topics T
          		LEFT JOIN users U
          			ON T.id_user = U.id_user
          WHERE T.id_topic=:topic

          Qu'obtiens-tu ?

          Je voulais aussi que tu confirmes un point : tu as bien activé l'affichage des erreurs PHP et PDO ?

          -
          Edité par Benzouye 5 septembre 2019 à 13:42:35

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            5 septembre 2019 à 23:28:34

            Alors oui, avec le Left Join c'est exactement ce que je cherchais,

            sans demander de cours , ce n'est pas comme ça que j'avais compris les jointures 

            j'étais persuadé qu'il suffisait que la valeur de la colonne A  soit * égale à l'autre colonne B (ON A=B) pour inner join et natural join

            oui les erreurs sont activée PHP ET PDO

            • Partager sur Facebook
            • Partager sur Twitter
              6 septembre 2019 à 8:34:53

              Avec le LEFT JOIN ca fonctionne ? Et tu récupères les données des users ? Pas cohérent avec tes premiers messages... car INNER JOIN t'aurait donné le même resultat ...

              Dans tous les cas je te conseille de (re)lire le cours MySQL et particulièrement le chapitre sur les jointures...

              -
              Edité par Benzouye 6 septembre 2019 à 8:55:58

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                6 septembre 2019 à 17:58:44

                salut benzouye

                Pas cohérent avec tes premiers messages... car INNER JOIN t'aurait donné le même resultat ...

                mais pourtant ..., j'avais essayé avec un natural puisqu'il y 'avait deux colonne ayant le même nom avant tout , puis inner. Sans jointure j'avais bien un résultat, mais dès que j'utilisais une de ces jointures j'avais false 

                Quand tu lis :

                "Lorsque l'on fait une jointure par la gauche (grâce aux mots-clés LEFT JOIN  ou LEFT OUTER JOIN), cela signifie que l'on veut toutes les lignes de la table de gauche (sauf restrictions dans une clause WHERE, bien sûr), même si certaines n'ont pas de correspondance avec une ligne de la table de droite."

                Perso, je comprenais (jusqu'à aujourd'hui), que l'on récupérais toutes les lignes de la table jointe alors qu'il n'y avait pas de lien

                mais c'est un peu plus clair right now

                • Partager sur Facebook
                • Partager sur Twitter
                  7 septembre 2019 à 23:12:43

                  Les jointures externes rendent la jointure facultative.

                  Si tu fais : A LEFT JOIN B, tu récupères tous les A qu'ils soient liés à B ou non ... tu récupères les B que si ils sont liés à un A. La jointure est "facultative".

                  Si tu fais : A INNER JOIN B, tu ne récupères que les A qui sont liés à B, la jointure est "obligatoire".

                  Si ta requête te retourne A et B avec un LEFT JOIN, elle te retourne la même chose avec INNER JOIN ...

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

                  jointure retourne false

                  × 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