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

Langage PHP Discussion :

Jointure pour récupérer 2 pseudos dans un forum


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut Jointure pour récupérer 2 pseudos dans un forum
    Bonjour,

    Je fais actuellement un forum et j'ai besoin de faire une jointure pour récupérer le pseudo de l'auteur de la création du topic et le pseudo de l'auteur du dernier post ! Je sais faire des jointures très basic mais là rien à faire, je ne sais même pas quelle jointure choisir.

    Voici un aperçu d'un salon de mon forum :

    Nom : salon.png
Affichages : 94
Taille : 19,1 Ko

    Je veux remplacer l'id membre 3 par le pseudo (username).

    voici les tables de mon forum + la table users pour les membres.

    Code sql : 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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    --
    -- Structure de la table `forum_groupes`
    --
     
    CREATE TABLE IF NOT EXISTS `forum_groupes` (
      `idgrp` tinyint(2) NOT NULL AUTO_INCREMENT,
      `titre` varchar(55) NOT NULL,
      `ordre` tinyint(2) NOT NULL,
      PRIMARY KEY (`idgrp`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `forum_messages`
    --
     
    CREATE TABLE IF NOT EXISTS `forum_messages` (
      `idmsg` smallint(5) NOT NULL AUTO_INCREMENT,
      `idsujet` smallint(5) NOT NULL,
      `message` text NOT NULL,
      `idmbr` int(10) NOT NULL,
      `dateheure` datetime NOT NULL,
      PRIMARY KEY (`idmsg`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `forum_salons`
    --
     
    CREATE TABLE IF NOT EXISTS `forum_salons` (
      `idsalon` tinyint(2) NOT NULL AUTO_INCREMENT,
      `titre` varchar(55) NOT NULL,
      `description` varchar(255) NOT NULL,
      `idgrp` tinyint(2) NOT NULL,
      `ordre` tinyint(2) NOT NULL,
      `etat` tinyint(1) NOT NULL,
      PRIMARY KEY (`idsalon`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `forum_sujets`
    --
     
    CREATE TABLE IF NOT EXISTS `forum_sujets` (
      `idsujet` smallint(5) NOT NULL AUTO_INCREMENT,
      `sujet` varchar(60) NOT NULL,
      `idsalon` smallint(5) NOT NULL,
      `idmbr` int(10) NOT NULL,
      `idmbr_dernier` int(10) NOT NULL,
      `derniermsg` datetime NOT NULL,
      `etat` tinyint(1) NOT NULL,
      PRIMARY KEY (`idsujet`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `users`
    --
     
    CREATE TABLE IF NOT EXISTS `users` (
      `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      `username` varchar(255) NOT NULL,
      `email` varchar(255) NOT NULL,
      `password` varchar(60) NOT NULL,
      `remember_token` varchar(255) DEFAULT NULL,
      `confirmation_token` varchar(255) DEFAULT NULL,
      `confirmed_at` datetime DEFAULT NULL,
      `reset_token` varchar(255) DEFAULT NULL,
      `reset_at` datetime DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

    Maintenant voici le code de la page qui affiche les sujets (topics).

    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
    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
    61
    62
    63
    64
    65
    <?php
    require '../../inc/functions.php';
    require_once '../../inc/db.php';
     
    $idsalon = (int) $_GET['idsalon'];
     
    require '../../inc/header.php';
    ?>
        <h1>Forum</h1>
     
    <?php
    // Si le visiteur est connecté alors je lui propose un bouton pour créer un nouveau sujet (topic).
    if(session_status() == PHP_SESSION_NONE){
        session_start();
    }
    if(!isset($_SESSION['auth'])){
        echo "<p>Vous n'êtes pas connecté</p>";
    }else{
        echo "<p><a class='btn btn-primary' href='nouveau.php?idsalon=$idsalon' role='button'>Nouveau</a></p>";
    }
    ?>
     
    <?php
     
    $reponse = $pdo->prepare('SELECT idsujet, sujet, idmbr, idmbr_dernier, derniermsg, etat FROM forum_sujets WHERE idsalon = ? AND etat != 0 ORDER BY etat, derniermsg');
    $reponse->execute(array($idsalon));
     
    if ($reponse->rowCount()>0)
    {
        ?>
        <table class="table table-striped">
            <tr>
                <td></td>
                <td>Sujet</td>
                <td>Rép.</td>
                <td>Dernier message</td>
            </tr>
        <?php
        while ($donnees = $reponse->fetch())
        {
            switch ($donnees->etat)
            {
                case 1 : $etat = "<img class=\"media-object\" src=\"../../ornements/forum/topic_read.gif\" alt=\"Actif\">"; break;
                case 2 : $etat = "<img class=\"media-object\" src=\"../../ornements/forum/topic_read_locked.gif\" alt=\"Vérouillé\">"; break;
            }
    ?>
            <tr>
                <td><?php echo $etat; ?></td>
                <td><a href="sujet.php?idsujet=<?php echo $donnees->idsujet; ?>"><?php echo $donnees->sujet; ?></a> <small>par <?php echo $donnees->idmbr; ?></small></td>
                <td>0</td>
                <td><?php echo $donnees->derniermsg; ?> <small>par <?php echo $donnees->idmbr_dernier; ?></small></td>
            </tr>
        <?php } ?>
        </table>
     
    <?php
    }
    else // S'il n'y a pas de message
    {
        echo'<p>Ce forum ne contient aucun sujet actuellement</p>';
    }
    $reponse->CloseCursor();
    ?>
     
    <?php require '../../inc/footer.php'; ?>
    d'autre part, si vous avez des suggestions sur mon code etc, je prends !

    merci à vous.

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 440
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 440
    Points : 15 814
    Points
    15 814
    Par défaut
    Je pense que le code serait plus simple si tu découpais la requête en 2 :
    1. une requête pour chercher l'auteur de la discussion
    2. une requête pour chercher le message le plus récent et, peut-être en même temps ou dans une 3e requête, chercher l'auteur de ce message

  3. #3
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    je n'ai pas trop compris le principe ?

    le sujet, l'auteur du topic, l'auteur du dernier post et la date du dernier post sont sur la même table donc pourquoi faire 2 requêtes ?

    requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $reponse = $pdo->prepare('SELECT idsujet, sujet, idmbr, idmbr_dernier, derniermsg, etat FROM forum_sujets WHERE idsalon = ? AND etat != 0 ORDER BY etat, derniermsg');
    $reponse->execute(array($idsalon));
    faut relier :

    idmbr à : id de la table users
    et
    idmbr_dernier à : id de la table users aussi.

    mais je ne sais pas comment faire.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2015
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2015
    Messages : 644
    Points : 1 509
    Points
    1 509
    Par défaut
    Bonjour,

    Peut-être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $reponse = $pdo->prepare('SELECT idsujet,
    sujet, 
    idmbr, 
    idmbr_dernier, 
    derniermsg, 
    etat,
    select (username from users where id = idmbr) as username
    FROM forum_sujets 
    WHERE idsalon = ? AND etat != 0 
    ORDER BY etat, derniermsg');
    ?

  5. #5
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 440
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 440
    Points : 15 814
    Points
    15 814
    Par défaut
    Citation Envoyé par bndd24 Voir le message
    pourquoi faire 2 requêtes ?
    comme je le disais dans mon message cela ferait du code plus simple, plus facile à relire et donc plus facile corriger en cas de problème et plus facile à maintenir s'il y a des modifications à faire plus tard.

  6. #6
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    jujupomme :

    J'ai essayé ton code mais j'ai une erreur :

    ( ! ) Fatal error: in C:\wamp64\www\site3\membres\forum\forum.php on line 39
    ( ! ) PDOException: in C:\wamp64\www\site3\membres\forum\forum.php on line 39
    La ligne 39 c'est la requête..

    et puis, dans ton code la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select (username from users where id = idmbr) as username
    rien n'indique quel pseudo tu veux récupérer ? l'auteur du topic ou celui du dernier post ? :/

    mathieu :

    J'ai essayé de mettre en pratique ton code mais j'ai des erreurs, de plus il me semble que c'est déconseillé de faire une requête dans une boucle ??

    par contre, je ne comprends toujours pas comment tu veux faire pour récupérer les deux pseudos (username) de l'auteur du topic + le pseudo du dernier post.

    tu as un bout de code ?

  7. #7
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2015
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2015
    Messages : 644
    Points : 1 509
    Points
    1 509
    Par défaut
    Je ne sais pas quel champ correspond à quelle information dans ta base...

    Je te fais juste deux requêtes en une. Mais l'erreur que tu sors est si vague. Tu peux débug un peu plus avec des flag PDO, firebug?

  8. #8
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    jujupomme :

    dans la table forum_sujets j'ai 2 champs :
    - idmbr qui indique l'id membre de l'auteur de la création du topic.
    - idmbr_dernier qui indique l'id membre du dernier message posté.

    Je veux donc relier :

    - idmbr à : id de la table users
    et même chose pour :
    - idmbr_dernier à : id de la table users

  9. #9
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2015
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2015
    Messages : 644
    Points : 1 509
    Points
    1 509
    Par défaut
    Donc ma requête associe bien l'id de l'auteur de la création du topic, à son nom.

    As-tu un FlameRobin, quelque chose pour tester les requêtes?

    Tu peux éventuellement essayer comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $reponse = $pdo->prepare('SELECT r.idsujet,
    r.sujet, 
    r.idmbr, 
    r.idmbr_dernier, 
    r.derniermsg, 
    r.etat,
    select (username from users u where u.id = r.idmbr) as username
    FROM forum_sujets r
    WHERE idsalon = ? AND etat != 0 
    ORDER BY etat, derniermsg');
    Sinon, comme je t'ai dis, mets des flag de débug, on en saura plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print_r($bdd->errorInfo());

  10. #10
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    malheureusement j'ai exactement les mêmes erreurs que tout à l'heure avec ton premier code :/

    et avec le :

    print_r($pdo->errorInfo());

    rien ne s'affiche..

  11. #11
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2015
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2015
    Messages : 644
    Points : 1 509
    Points
    1 509
    Par défaut
    Pratique... Tu utilises Firebug?

  12. #12
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    non mais je suis déjà sur la page : https://addons.mozilla.org/fr/firefox/addon/firebug/

  13. #13
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2015
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2015
    Messages : 644
    Points : 1 509
    Points
    1 509
    Par défaut
    Et bien installe le, et ouvre le (f12). Rafraîchis ta page, fais ta manip, et regarde dans réseau sur ta requête, ou dans console, je sais pas trop quelle manip tu fais

  14. #14
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    j'ai installé l'addon mais je vais ou ensuite ?

    j'ai ouvert comme ceci mais après..

    Nom : Sans titre.png
Affichages : 87
Taille : 21,9 Ko

  15. #15
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2015
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2015
    Messages : 644
    Points : 1 509
    Points
    1 509
    Par défaut
    Si tu as rien dans Console, tu vas dans réseau. Dans cet onglet, tu auras toutes tes requêtes et donc probablement, celle qui ne fonctionne pas.

    Tu as rajouté le print_r que je t'ai indiqué?

  16. #16
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    oui comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $reponse = $pdo->prepare('SELECT r.idsujet,
    r.sujet,
    r.idmbr,
    r.idmbr_dernier,
    r.derniermsg,
    r.etat,
    select (username from users u where u.id = r.idmbr) as username
    FROM forum_sujets r
    WHERE idsalon = ? AND etat != 0
    ORDER BY etat, derniermsg');
    $reponse->execute(array($idsalon));
    print_r($pdo->errorInfo());
    Nom : Sans titre.png
Affichages : 84
Taille : 49,0 Ko

  17. #17
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2015
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2015
    Messages : 644
    Points : 1 509
    Points
    1 509
    Par défaut
    Et du coup, si tu cliques sur le + de forum.php?

    Egalement, tu es sur que ton array est remplit?

  18. #18
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    je n'y comprends rien.. bref j’arrête je vais voir sur codeur si je peux trouver quelqu'un qui me fasse la requête, ras le bol, 2 jours et demi sur une requête et je n'avance pas..

    je te remercie pour ton coup de main l'ami

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/11/2006, 08h37
  2. Réponses: 5
    Dernier message: 31/08/2006, 21h39
  3. Réponses: 12
    Dernier message: 26/06/2006, 00h24
  4. Réponses: 5
    Dernier message: 09/09/2005, 18h51
  5. problème pour récupérer une valeur dans ma bd (débutante)
    Par auryn111 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 26/08/2005, 18h49

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