Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jointure entre tables et affichage commentaires

Sujet résolu
    16 septembre 2019 à 3:02:22

    Bonsoir à tous,

    Me revoilà pour un nouveau problème, désolé de vous embêter mais je n'ai absolument rien compris aux jointures entre tables.

    Je vous explique, j'ai une table membres: id, id_groupe, photoprofil, pseudo, pseudo_psn, facebook, twitter, twitch, instagram, email, mot_de_passe, date_inscription

    Table membres

    et une table commentaires:

    Table commentaires

    Comme vous le devinerez, id_membres de la table commentaire correspond à l'id de la table membres.

    Ce que je souhaite faire c'est afficher les commentaires postés en y joignant quelques infos du membre qui a commenté.

    J'ai fait un code, mais rien ne s'affiche, et je n'ai pas d'erreur à l'écran (j'en avais avant mais depuis ce code je n'en ai plus).

    J'espère que j'ai été assez claire car je ne sais pas trop comment expliquer.

    Voici le code:

    $reqvisucommentairespve=$bdd->prepare('SELECT photoprofil, pseudo, id_membre, commentaire, DATE_FORMAT(date_commentaire, \'%d/%m/%Y à %Hh%imin%ss\') AS date_commentaire FROM commentairespve INNER JOIN membres ON id_membre = id ORDER BY date_commentaire');
    			$reqvisucommentairespve->execute(array('photoprofil, pseudo, commentaire, date_commentaire'));
    			while ($visucommentairespve=$reqvisucommentairespve->fetch())
    				{
    	?>
    			<p><strong><?php echo '<img class="photoprofil" src="photos_profils/'.$visucommentairespv["photoprofil"].'alt="photoprofil" width="50px">' (htmlspecialchars($visucommentairespve['pseudo'])); ?> </strong> le <?php echo $visucommentairespve['date_commentaire']; ?></p>
    			<p><?php echo nl2br(htmlspecialchars($visucommentairespve['commentaire'])); ?></p>
    	<?php
    				}
    			$reqvisucommentairespve->closeCursor();

    Merci de votre aide

    -
    Edité par StellaSky 16 septembre 2019 à 3:04:42

    • Partager sur Facebook
    • Partager sur Twitter
      16 septembre 2019 à 9:44:35

      Salut

      Un conseil quand tu dois gérer des requêtes, vérifies qu'elles fonctionnent bien directement sur PhpMyAdmin ^^. 

      Comme ça tu n'as plus qu'à la mettre en place sur php, tu sais qu'elle est fonctionnelle. 

      Concernant ton problème, tu prépares une requête sans marqueurs, et dans ton execute, tu indiques un array qui n'a visiblement rien à faire là. C'est sûrement ça qui coince. 

      un exemple de préparation de requête

      $requete = $bdd->prepare('SELECT * from table where id = :id');
      $requete->execute(['id' => 123]);
      // revient à faire (en sécurisé)
      'SELECT * FROM table where id = 123;'

      En gros si tu as des marqueurs dans ta requête, tu mets dans ton execute à quoi chaque marqueur correspond. 

      Si tu n'as pas de valeur particulière à passer, tu 'nas pas besoin de préparer ta requête ^^. 

      Sinon pour ta jointure tu y es presque, 

      FROM commentairespve INNER JOIN membres ON commentairespve.id_membre = membres.id

      devrait faire l'affaire ^^


      -
      Edité par Ryukotsei 16 septembre 2019 à 9:48:07

      • Partager sur Facebook
      • Partager sur Twitter
        16 septembre 2019 à 9:50:46

        Salut,

        je vais compléter quand même un peu @Ryu ;)

        Pour faire (TRÈS) simple voilà comment tu peux faire pour tes requêtes (ATTENTION c'est juste une astuce hein ;) )

        • Requête sans marqueur <=> sans donnée extérieure => utilise PDO::query()
        • Requête avec marqueur(s) => utilise les marqueurs nominatif (:toto) => PDO::prepare() => PDOStatement::bindValue() => PDOStatement::execute()

        Je te conseille d'aller faire un tour sur la doc qui est très complète avec ses exemples

        • Partager sur Facebook
        • Partager sur Twitter
          16 septembre 2019 à 10:57:29

          Vas dans php my admin, onglet sql et lance ce script.

          ALTER TABLE nom table
          ADD CONSTRAINT fk_client_numero FOREIGN KEY (nom colonne) REFERENCES nomtablereference(nomcolonnereference);


          Edit : Il faut que tes table soit en moteur InnoDB (onglet opération)
          Edit2 : Apparament une clès etrangère n'est pas obligatoire pour une jointure. Autant pour moi.

          -
          Edité par -Crixus- 16 septembre 2019 à 11:14:51

          • Partager sur Facebook
          • Partager sur Twitter

          "Etre vrai, peu le peuvent."
          Friedrich Nietzsche

            16 septembre 2019 à 13:58:06

            Bonjour,

            Ryukotsei

            La requête fonctionne sur PHPMyAdmin, mais dès que je la copie/colle dans sublime text elle ressemble à ça:

            Sur PHPMyAdmin: 

            SELECT photoprofil, pseudo, id_membre, commentaire, DATE_FORMAT(date_commentaire, '%d/%m/%Y à %Hh%imin%ss') AS date_commentaire FROM commentairespve INNER JOIN membres ON commentairespve.id_membre = membres.id ORDER BY date_commentaire

            Sur sublime text:

            requete sublime text

            $reqvisucommentairespve=$bdd->prepare('SELECT photoprofil, pseudo, id_membre, commentaire, DATE_FORMAT(date_commentaire, \'%d/%m/%Y à %Hh%imin%ss\') AS date_commentaire FROM commentairespve INNER JOIN membres ON commentairespve.id_membre = membres.id ORDER BY date_commentaire');
            			while ($visucommentairespve=$reqvisucommentairespve->fetch())

            Et rien ne s'affiche à l'écran.

            J'ai échappé les ' pour la date car jusque la c'est toujours ce que j'ai eu besoin de faire pour que ça fonctionne et que PHP ne pense pas que la requête se finisse la. Mon souci est que dès que je met les points pour commentairespve.id_membre et membres.id, les mots deviennent violets, j'ai essayé d'échapper les points aussi mais rien ne s'affiche à l'écran et pas d'erreur signalé par PHP.

            christouphe

            Je ne connais pas PDO::query, PDO::prepare et PDOstatement, dans les cours que j'ai vu, je n'ai que $bdd->prepare et execute.

            MarcKa

            Je suis désolé mais je n'ai pas compris :(

            • Partager sur Facebook
            • Partager sur Twitter
              16 septembre 2019 à 14:06:11

              Là c'est normal. Tu ne fais que préparer ta requête, elle n'est pas exécutée. 

              En gros, on utilise une requête préparée quand on doit entrer des données extérieures comme a dit christouphe (des données récupérées d'un formulaire par exemple). La requête préparée protège des injections SQL.

              Là, comme tu n'as pas de données extérieures, tu peux utiliser Query.

              $reqvisucommentairespve=$bdd->query('SELECT photoprofil, pseudo, id_membre, commentaire, DATE_FORMAT(date_commentaire, \'%d/%m/%Y à %Hh%imin%ss\') AS date_commentaire FROM commentairespve INNER JOIN membres ON commentairespve.id_membre = membres.id ORDER BY date_commentaire');



              -
              Edité par Ryukotsei 16 septembre 2019 à 14:07:33

              • Partager sur Facebook
              • Partager sur Twitter
                16 septembre 2019 à 14:09:51

                Dans un sens ce sont des données extérieurs puisque ce sont les commentaires des membres du site., ils viennent bien d'un formulaire pour poster des commentaires, c'est pour cela que j'utilise la requête préparée.

                Mais du coup la, je ne sais plus ce que je dois faire :'(

                Voulez-vous que je mette le code de la page entière?

                -
                Edité par StellaSky 16 septembre 2019 à 14:10:20

                • Partager sur Facebook
                • Partager sur Twitter
                  16 septembre 2019 à 14:11:45

                  christouphe a écrit:

                  Salut,

                  je vais compléter quand même un peu @Ryu ;)

                  Pour faire (TRÈS) simple voilà comment tu peux faire pour tes requêtes (ATTENTION c'est juste une astuce hein ;) )

                  • Requête sans marqueur <=> sans donnée extérieure => utilise PDO::query()
                  • Requête avec marqueur(s) => utilise les marqueurs nominatif (:toto) => PDO::prepare() => PDOStatement::bindValue() => PDOStatement::execute()

                  Je te conseille d'aller faire un tour sur la doc qui est très complète avec ses exemples



                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 septembre 2019 à 14:17:44

                    Là on part du principe que tu affiches des commentaires que tu as déjà en base de données.

                    Si effectivement tes commentaires viennent d'un formulaire, c'est lors de leur insertion en effet que tu dois faire une requête préparée. Une fois qu'ils sont enregistrés c'est bon ^^. 

                    Sauf si tu recherches un commentaire avec un id particulier où là tu dois effectivement faire une requête préparée. Mais là tu n'en as visiblement pas besoin pour cette requête. Chaque requête est différente. Ce n'est pas parce qu'une a été préparée que toutes doivent l'être. 

                    Exemples de cas où tu dois faire une préparée:

                    -> insertion d'un commentaire en base

                    $requete = $bdd->prepare("INSERT INTO commentaire (contenu) VALUES (:contenu);");
                    $requete->execute(['contenu' => $contenu]);

                    -> suppression d'un commentaire (le marqueur peut être l'identifiant du commentaire)

                    $requete = $bdd->prepare("DELETE FROM commentaire WHERE id = :id_commentaire;");
                    $requete->execute(['id_commentaire' => $id_commentaire']);

                    -> édition d'un commentaire (les marqueurs seraient par exemple l'identifiant et le contenu)

                    $requete = $bdd->prepare("UPDATE commentaire SET contenu = :contenu WHERE id = :id_commentaire;");
                    $requete->execute(['contenu' = $contenu, 'id_commentaire' => $id_commentaire]);

                    -> affichage d'un commentaire répondant à certains critères ( affichage par utilisateur, article ..., les cas où tu aurais une clause WHERE dans la requête en gros)

                    $requete = $bdd->prepare("SELECT * FROM commentaire WHERE id_membre = :id_membre;");
                    $requête->execute(['id_membre' => $id_membre]);



                    Cas où tu n'en as pas besoin

                    -> affichage de tous tes commentaires (sans clause where donc).

                    $requete = $bdd->query('SELECT * FROM commentaire;');



                    -
                    Edité par Ryukotsei 16 septembre 2019 à 14:54:06

                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 septembre 2019 à 14:55:43

                      Il y a du mieux avec ce code:

                      $reqvisucommentairespve=$bdd->query('SELECT photoprofil, pseudo, id_membre, commentaire, DATE_FORMAT(date_commentaire, \'%d/%m/%Y à %Hh%imin%ss\') AS date_commentairepve FROM commentairespve INNER JOIN membres ON commentairespve.id_membre = membres.id ORDER BY date_commentaire');
                      			while ($visucommentaires = $reqvisucommentairespve->fetch())
                      				{
                      	?>
                      			<p class=flottecom><img class="photoprofil" src="photos_profils/<?php echo $visucommentaires["photoprofil"]?>" alt="photoprofil" width="50px"></p><p class="pseudocommentaires"><?php echo (htmlspecialchars($visucommentaires['pseudo'])); ?> le <?php echo $visucommentaires['date_commentairepve']; ?></p><br >
                      			<p><?php echo nl2br(htmlspecialchars($visucommentaires['commentaire'])); ?></p>
                      	<?php
                      			$reqvisucommentairespve->closeCursor();
                      				}

                      Je m'inquiétais des mots en violets sur sublime text qui jusque la disais fin de la requête ou un truc du genre, mais ce n'est pas le cas ici visiblement.

                      Mon souci maintenant est que ça n'affiche qu'un seul commentaire :(

                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 septembre 2019 à 14:58:01

                        Heu essaye avec fetchAll() au lieu de fetch().
                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 septembre 2019 à 14:59:38

                          Ta phrase "[...]Je ne connais pas les méthodes ... [...]" n'est pas acceptable, si tu ne connais pas ce que je te donne, tu va lire les doc sur PHP.net (EN / FR)

                          EDIT: il n'affiche qu'UN SEUL commentaire car tu fais le closeCursor() dans la boucle WHILE, sort le de là, supprimes le d'ailleurs

                          -
                          Edité par christouphe 16 septembre 2019 à 15:01:34

                          • Partager sur Facebook
                          • Partager sur Twitter
                            16 septembre 2019 à 15:05:53

                            Ryukotsei

                            Avec fetchAll() il ne reconnais plus mes index :(

                            christouphe

                            Je suis désolé, mais j'ai suivi les cours HTML, CSS et PHP et il ne me semble pas qu'il y est les méthodes dont tu parles, ou peut être qu'elles portent un autre nom, c'est pour cela que j'ai dis ça.

                            Effectivement en enlevant le closeCursor(), tous les commentaires s'affichent, du coup je n'ai pas du comprendre quand l'utiliser lui aussi. Je relirai le cours.

                            Merci à vous de votre aide.

                            Pour la suite, j'aimerai que les membres puissent répondre à un commentaire en particulier, et non que ce commentaire soit au dessus des autres s'il s'agit d'une réponse.

                            J'aimerai aussi pouvoir installer des notifications en cas de réponse et que les membres puissent se mentionner (à la manière de Facebook ou Twitter avec le @ par exemple).

                            Et aussi créer un espace administration (Pour avoir des administrateurs et modérateur pour gérer commentaires et autres peut être plus tard).

                            Savez-vous ou je peux me renseigner pour apprendre à faire tous ça?

                            -
                            Edité par StellaSky 16 septembre 2019 à 15:11:44

                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 septembre 2019 à 15:13:14

                              Tu as édité au moment de la rédaction du message.

                              Pense que le cours n'est que 10% de l'apprentissage, php.net est là pour connaitre une partie du reste

                              -
                              Edité par christouphe 16 septembre 2019 à 15:14:42

                              • Partager sur Facebook
                              • Partager sur Twitter
                                16 septembre 2019 à 15:28:23

                                christouphe

                                Je suis aller plusieurs fois sur la doc php.net, et j'avoue que même en relisant 15 fois, il y a beaucoup de choses que je ne comprend pas, même si certaines fois ça m'a aidée quand même, je persiste mais c'est pas simple pour une débutante et j’airerai avoir finie le plus gros de mon site avant le 01/10 car j'aurai une occupation en plus à cette date qui fera que j'aurai moins de temps pour le faire.

                                Je retourne régulièrement dessus pour essayer de comprendre, mais j'ai vraiment du mal.

                                -
                                Edité par StellaSky 16 septembre 2019 à 15:32:54

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  16 septembre 2019 à 15:41:18

                                  ok, mais rien ne t'interdit de venir dire "j'ai trouvé mais je ne comprends pas" ;)
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    17 septembre 2019 à 14:09:51

                                    Oui je comprend, dans ce cas je donne un exemple de ce que je comprend dans la doc et ce que je ne comprend pas.

                                    Par exemple pour setcookie, bon je sais l'utiliser car il est dans le cours que j'ai vu, mais admettons que je ne l'avais pas vu dans le cours, à partir de la doc, je ne suis pas sur que j'aurai réussie.

                                    Je comprend une partie de la description mais pas ça:

                                    Le souci c'est que ce genre de description est quasiment dans toutes les docs que j'ai vu sur PHP et ça me perd totalement :(

                                    -
                                    Edité par StellaSky 17 septembre 2019 à 14:11:14

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      17 septembre 2019 à 14:17:39

                                      C'est la définition globale de la fonction:

                                      Votre plus grand problème (@ tous) est de faire un scroll down ;)

                                      Liste de paramètres

                                      La » RFC 6265 est la référence pour l'interprétation des paramètres passés à setcookie().

                                      name

                                      Le nom du cookie.

                                      value

                                      La valeur du cookie. Cette valeur est stockée sur l'ordinateur du client ; ne stockez pas d'informations importantes. Si le paramètre name vaut 'cookiename', cette valeur est récupéré avec <var class="varname"><var class="varname">$_COOKIE['cookiename']</var></var>.

                                      expires

                                      Le temps après lequel le cookie expire. C'est un timestamp Unix, donc, ce sera un nombre de secondes depuis l'époque Unix (1 Janvier 1970). En d'autres termes, vous devriez fixer cette valeur à l'aide de la fonction time() en y ajoutant le nombre de secondes après lequel on veut que le cookie expire. Vous pouvez utiliser aussi mktime(). time()+60*60*24*30 fera expirer le cookie dans 30 jours. Si vous ne spécifiez pas ce paramètre ou s'il vaut 0, le cookie expirera à la fin de la session (lorsque le navigateur sera fermé).

                                      Note:

                                      Vous pourrez noter que le paramètre expires prend un timestamp unique, et non pas la date au format Jour, JJ-Mois-AAAA HH:MM:SS GMT, car PHP fait la conversion en interne.

                                      path

                                      Le chemin sur le serveur sur lequel le cookie sera disponible. Si la valeur est '/', le cookie sera disponible sur l'ensemble du domaine domain. Si la valeur est '/foo/', le cookie sera uniquement disponible dans le répertoire /foo/ ainsi que tous ses sous-répertoires comme /foo/bar/ dans le domaine domain. La valeur par défaut est le répertoire courant où le cookie a été défini.

                                      domain

                                      Le (sous-)domaine pour lequel le cookie est disponible. Définir ceci à un sous-domaine (tel que 'www.example.com') rendra le cookie disponible pour ce sous-domaine ainsi que tous ses sous-domaines (par exemple: w2.www.example.com). Pour rendre le cookie disponible sur tout le domaine (ainsi que tous ses sous-domaines), définissez simplement la valeur avec le nom de domaine ('example.com', avec cet exemple).

                                      Les anciens navigateurs continuant d'implémenter la » RFC 2109 (obsolète) peuvent nécessiter un . pour rendre disponible tous les sous-domaines.

                                      secure

                                      Indique si le cookie doit uniquement être transmis à travers une connexion sécurisée HTTPS depuis le client. Lorsque ce paramètre vaut TRUE, le cookie ne sera envoyé que si la connexion est sécurisée. Côté serveur, c'est au développeur d'envoyer ce genre de cookie uniquement sur les connexions sécurisées (par exemple, en utilisant la variable <var class="varname"><var class="varname">$_SERVER["HTTPS"]</var></var>).

                                      httponly

                                      Lorsque ce paramètre vaut TRUE, le cookie ne sera accessible que par le protocole HTTP. Cela signifie que le cookie ne sera pas accessible via des langages de scripts, comme Javascript. Il a été suggéré que cette configuration permet de limiter les attaques via XSS (bien qu'elle ne soit pas supportée par tous les navigateurs), néanmoins ce fait est souvent contesté. Ajouté en PHP 5.2.0. TRUE ou FALSE

                                      options

                                      Un tableau associatif qui peut avoir comme clés expires, path, domain, secure, httponly et samesite. Les valeurs ont la même signification que celles décrits pour les paramètres avec le même nom. La valeur de l'élément samesite doit soit être Lax soit Strict. Si une options autorisé n'est pas donnée alors sa valeur par défaut sera identique à la valeur par défaut des paramètres explicite. Si l'élément samesite est omit, alors l'attribut SameSite du cookie ne sera pas définie.

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        17 septembre 2019 à 14:43:33

                                        Non non aucun souci de scroll down chez moi, j'ai bien vu la liste des paramètres, j'ai même regardé les exemples en dessous, mais ça ne m'aide pas plus à comprendre, je comprend la liste des paramètres, mais même si je vois ou les mettre du coup dans le code du haut, je ne comprend pas le $string par exemple.

                                        En gros pour faire un cookie, j'aurai été capable de faire ça:

                                        setcookie ( string $pseudo [, string $value = "pseudo" [, int $espire = time()+60*60*24*30 [, string $path = "/" [, string $domain = "example.com" [, bool $secure = true [, bool $httponly = true ]]]]]] ) : bool

                                        J'ai vu aussi les exemples en dessous, mais j'ai aussi du mal à les comprendre.

                                        Bref tout ça pour dire, que à mon niveau, je ne trouve pas que ce soit très clair pour certaines pages, pour les débutants, limite il me faudrait un cours sur la doc PHP :euh:

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          17 septembre 2019 à 15:10:24

                                          dans la définition d'une fonction, on stipule les nom de type de la variable.

                                          Donc si tu les supprime et si tu fais comme l'appel d'une fonction :

                                          <?php
                                          setcookie ($pseudo,"pseudo",(time()+60*60*24*30))



                                          -
                                          Edité par christouphe 17 septembre 2019 à 15:13:51

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            17 septembre 2019 à 15:18:12

                                            Du coup je ne comprend pas à quoi correspond les 'string', '[', 'int' et 'bool' ?

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              17 septembre 2019 à 15:35:57

                                              il indique le type de donnée à mettre aux paramètres. Si la fonction demande un int et que tu met une chaine, tu aura une erreur en retour.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                17 septembre 2019 à 15:45:35

                                                D'accord donc INT= chiffre, bool = true ou false, mais string et les []?

                                                Désolé d'être "chiante", mais j'essai de comprendre pour éviter de vous soliciter à chaque fois que j'irai sur la doc 

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  17 septembre 2019 à 16:02:07

                                                  les [ <=> paramètre facultatif :)

                                                  Non tu n'es pas chiante, tu as des questions ;)

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    17 septembre 2019 à 16:18:54

                                                    Et les strings ce sont les chaînes de caractères ^^

                                                    On est tous passés par là, il vaut mieux poser les questions que rester larguée ^^ 

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      17 septembre 2019 à 16:46:43

                                                      D'accord, merci beaucoup :)

                                                      Je met le sujet en résolu et vous remercie beaucoup de votre aide.

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter

                                                      Jointure entre tables et affichage commentaires

                                                      × 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