Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec fetch()

    15 décembre 2018 à 20:43:15

    Bonsoir à tous,

    J'ai un petit souci avec fetch() en POO. Je croyais que fetch retournait false quand il ne trouvait aucun résultat. Hors, en faisant var_dump, il me retourne un array avec des valeurs null.

    array(16) { [0]=> NULL [1]=> NULL [2]=> NULL [3]=> NULL etc..}

    Comment ça se fait ?

    • Partager sur Facebook
    • Partager sur Twitter
      15 décembre 2018 à 20:47:30

      Salut,

      Tu as testé ta requête dans PHPMYADMIN et tu as aucun résultat ? Mais enfin on a peu d'infos.

      • Partager sur Facebook
      • Partager sur Twitter
      le bienfait n'est jamais perdu
        15 décembre 2018 à 20:58:07

        Oui c'est normal que la requête ne retourne rien, c'est fait exprès. J'ai besoin de tester si une requête retourne quelque chose ou rien. Par exemple si quelqu'un change l'id dans l'url.
        • Partager sur Facebook
        • Partager sur Twitter
          15 décembre 2018 à 21:11:02

          > Je croyais que fetch retournait false quand il ne trouvait aucun résultat.

          C'est le cas, pas possible ton truc/tu dois confondre 2 situations différentes (sachant qu'on a ni le code ni même la requête)

          -
          Edité par julp 15 décembre 2018 à 23:08:36

          • Partager sur Facebook
          • Partager sur Twitter
            15 décembre 2018 à 21:47:42

            C'est une requête un peu longue et compliquée avec des group_concat, left join et inner join.

            Si je la remplace par une requête simple du genre SELECT id FROM table WHERE id = :id, effectivement fetch fonctionne et me renvoie bien false si aucun résultat :o

            • Partager sur Facebook
            • Partager sur Twitter
              15 décembre 2018 à 21:54:36

              fetch renvoie bien FALSE s'il n y as pas de résultat. Maintenant si tu as des NULL, sachant qu'il existe des fonctions MYSQL qui renvoie NULL dans certains cas, ceci peut expliquer cela.

              On a pas la requête, ni un jeu de résultat pour tester donc on ne va que spéculer.

              -
              Edité par WillyKouassi 15 décembre 2018 à 21:55:46

              • Partager sur Facebook
              • Partager sur Twitter
              le bienfait n'est jamais perdu
                16 décembre 2018 à 12:42:43

                public function getById($id)
                {
                       $sql = parent::$db->prepare("SELECT movies.id, origine, year, title, vo, 
                DATE_FORMAT(sortie_fr,'%d %c %Y') AS sortie_fr, 
                DATE_FORMAT(sortie_us,'%d %c %Y') AS sortie_us, synopsis, slug, src, alt, sites.site, 
                GROUP_CONCAT(DISTINCT CASE WHEN jobs.id=1 THEN name END ORDER BY personsjobs.id ASC SEPARATOR ', ') AS directors, 
                GROUP_CONCAT(DISTINCT CASE WHEN jobs.id=2 THEN name END ORDER BY personsjobs.id ASC SEPARATOR ', ') AS actors, 
                GROUP_CONCAT(CASE WHEN jobs.id=1 THEN persons.id END SEPARATOR ';') AS idsDirectors, 
                GROUP_CONCAT(CASE WHEN jobs.id=2 THEN persons.id END SEPARATOR ';') AS idsActors 
                FROM movies LEFT JOIN posters ON posters.id_movie=movies.id 
                INNER JOIN personsjobs ON personsjobs.id_movie = movies.id 
                INNER JOIN persons ON persons.id=personsjobs.id_person 
                INNER JOIN jobs ON jobs.id=personsjobs.id_job 
                INNER JOIN sites ON sites.id=movies.site WHERE movies.id = :id");
                
                	$sql->bindValue(':id', $id, PDO::PARAM_INT);
                
                	$sql->execute();
                
                	$fetch = $sql->fetch();
                
                	$sql->closeCursor();
                
                	return $fetch;
                }

                Que ce soit avec fetch ou fetchAll, quand l'id est bidon, cette requête génère un array de ce type.

                array(16) { ['id']=> NULL ['origine']=> NULL ['year']=> NULL ['title']=> NULL etc..}

                -
                Edité par cypher01 16 décembre 2018 à 13:08:02

                • Partager sur Facebook
                • Partager sur Twitter
                  17 décembre 2018 à 19:39:07

                  J'ai trouvé, fallait mettre GROUP BY movies.id à la fin de la requête :D

                  La requête est quand même assez tordue. J'ai un controller MOVIES, un controller PERSON, un controller POSTER. Il me semblait logique de partir du controller principal MOVIES pour ensuite demander le poster associé à ce film, puis le casting associé à ce film avec des INNER JOIN et LEFT JOIN.

                  Comment faire plus propre ?

                  -
                  Edité par cypher01 17 décembre 2018 à 22:00:09

                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 décembre 2018 à 20:37:47

                    Peut être qu'en voyant la structure de tes tables. Je ne comprends pas trop ces affaires de "controller" et LEFT JOIN
                    • Partager sur Facebook
                    • Partager sur Twitter
                    le bienfait n'est jamais perdu
                      25 décembre 2018 à 18:39:53

                      Je me demande s'il faut faire une seule table PERSONNE ou deux tables identiques (même colonnes) REALISATEUR, ACTEUR.

                      -
                      Edité par cypher01 25 décembre 2018 à 18:40:27

                      • Partager sur Facebook
                      • Partager sur Twitter
                        28 décembre 2018 à 20:31:26


                        A votre avis ?

                        -
                        Edité par cypher01 28 décembre 2018 à 20:31:58

                        • Partager sur Facebook
                        • Partager sur Twitter
                          28 décembre 2018 à 20:48:14

                          Comment se présentent tes tables actuellement?

                          Edit: En l'état actuel pas besoin de créer les tables acteur et realisateur. C'est l'id de la fonction qui doit migrer dans la table personne si une personne est soit réalisateur ou acteur..

                          Sinon créer une table personne_fonction par exemple si une personne peut être réalisateur et acteur.

                          PS: Si tu as des difficultés en modélisation basique alors je sens que dans ton système ça ne doit pas être la fête, parce que bon ta requête actuelle semble "compliqué"

                          -
                          Edité par WillyKouassi 28 décembre 2018 à 20:53:56

                          • Partager sur Facebook
                          • Partager sur Twitter
                          le bienfait n'est jamais perdu
                            28 décembre 2018 à 20:55:48

                            J'ai choisi PERSONNE et FONCTIONS. J'ai aussi fait cette table PERSONNE_FONCTION avec l'id du film. L'inconvénient c'est que PERSONNE va vite devenir énorme avec beaucoup d'enregistrements. Surtout si je rajoute Producteur, Scénariste, etc...

                            L'autre option ACTEUR, REALISATEUR est plus souple mais redondante au niveau de la structure (id, nom, prénom à chaque fois).

                            -
                            Edité par cypher01 28 décembre 2018 à 20:57:17

                            • Partager sur Facebook
                            • Partager sur Twitter
                              28 décembre 2018 à 21:01:56

                              Ouais mais si tu n'enregistres que les nom et prénoms des producteurs, scénaristes, acteurs etc... pas besoin de créer autant de tables , une seule table personne suffit.

                              PS: Demande à un modo de diviser et déplacer une partie des messages dans la section BDD

                              -
                              Edité par WillyKouassi 28 décembre 2018 à 21:04:41

                              • Partager sur Facebook
                              • Partager sur Twitter
                              le bienfait n'est jamais perdu
                                28 décembre 2018 à 21:07:53

                                Ouais mais du coup ma requête sql va être encore plus compliquée si je veux afficher une fiche de film avec son réalisateur, ses acteurs, ses producteurs, etc..

                                Comment on contacte un modo ?

                                -
                                Edité par cypher01 28 décembre 2018 à 21:09:54

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  28 décembre 2018 à 21:31:08

                                  > Comment on contacte un modo ?

                                  En l'invoquant magiquement :D

                                  Blague à part, tu peux signaler ton message et ainsi ça affichera une alerte visible par toute l'équipe de modération.

                                  Sauf que, dans ce cas précis, le forum ne permet pas de "diviser et déplacer une partie des messages". Si le sujet dérive, je peux en revanche suggérer de créer un nouveau sujet (en mettant un lien vers et depuis ce nouveau sujet pour les curieux qui voudraient avoir l'historique). Désolée de ne pas pouvoir faire plus.

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Pas d'aide concernant le code par MP, le forum est là pour ça :)

                                    29 décembre 2018 à 19:17:45

                                    @Lamecarlate, bon pas bien grave.

                                    Dans ton système actuel si les fonctions sont déterminées en fonction du film, je garderais une table personne et dans la table personne_film (id_film, id_personne, id_fonction), Exemple de requête qui retourne le réalisateur, les acteurs d'un film, le titre du film

                                    SELECT GROUP_CONCAT(nom SEPARATOR ';') AS liste_personne, lib_fonction, titre 
                                    FROM personne p
                                    JOIN personne_film pf ON p.id_personne = pf.id_personne
                                    JOIN fonction f ON f.id_fonction = pf.id_fonction
                                    JOIN film f2 ON f2.id_film = pf.id_film
                                    WHERE pf.id_film = :id_film
                                    GROUP BY fonction, titre

                                    Tu auras dans ce cas 3 colonnes (liste_personne, fonction, titre), pas besoin de CASE WHEN. 

                                    -
                                    Edité par WillyKouassi 29 décembre 2018 à 19:18:47

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    le bienfait n'est jamais perdu
                                      29 décembre 2018 à 20:00:26

                                      Bonjour,

                                      Mauvais forum

                                      Le sujet est déplacé de la section PHP vers la section Base de données

                                      Le modèle n'est pas bon selon moi ... Il ne devrait pas y avoir de id_personne dans la table fonction ...

                                      Le modèle habituel pour ce genre de données est plutôt :

                                      • film ( id_film [pk], titre, etc. )
                                      • personne ( id_personne [pk], nom, prenom, etc. )
                                      • fonction ( id_fonction [pk], libelle )
                                      • film_personne ( id_film [pk][fk], id_personne [pk][fk], id_fonction [pk][fk] )

                                      Cela se déduit des cardinalités, que tu n'as visiblement pas prises en comptes ...

                                      Une personne peut intervenir sur plusieurs films et un film peut avoir plusieurs personnes intervenantes. Mais une personne peut également intervenir plusieurs fois pour le même film avec des fonctions différentes (réalisateur et acteur, ou réalisateur et scénariste, etc.).

                                      La table film_personne proposée ici permet de remplir ces conditions ...

                                      Et peu importe si la table personne grossit, tant que tu ne stockes pas deux fois la même personne ...

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

                                      Problème avec fetch()

                                      × 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