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

PHP & Base de données Discussion :

[SQL] 2 tables qui se croisent en leur "pseudo"


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 109
    Par défaut [SQL] 2 tables qui se croisent en leur "pseudo"
    Bonjour,

    Sur mon site les visiteurs peuvent enregistrer un rêve soit en étant inscrit (ils se voient alors attribuer un id individuel et permanant - si le membre modifie son pseudo, son id reste quand mm le même -, soit en ne l'étant pas.

    J'ai 2 tables :
    - reves avec les champs suivants (entre autres) : id, titre, reve, pseudo, pseudo_id, date...
    - reves_reveurs, avec les champs suivants (entre autres) : id, pseudo,...

    Dans la table reves l'id correspond à l'id du rêve, pseudo au pseudo du rêveur si il n'est pas inscrit, et pseudo_id correspond à l'id du membre dans la table reves_reveurs.

    Je souhaite afficher un lien vers une page de description du membre si le rêveur du rêve affiché est un membre inscrit. Mais je sèche un peu sur la requête à faire. Voici ce que j'ai fait :

    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
    $sql = "SELECT RR.titre, RR.reve, RR.pseudo, RR.pseudo_id, RR.date, RRVR.pseudo as pseudo_inscrit FROM reves_reves RR, reves_reveurs RRVR WHERE RR.id='$id' AND RR.activity='on' AND RRVR.id = RR.pseudo_id";
    $req = mysql_query($sql) or die('ERREUR sql !<br>'.$sql.'<br>'.mysql_error());
    $db_data_reve = mysql_fetch_assoc($req);
     
    // Affichage du header
    include ("header.php");
     
    // Affichage du rêve
    	echo "<h2>".$db_data_reve['titre']."</h2>
    	<p class=\"reve_infos\">Le ";
    	datetime_fr($db_data_reve['date']);
    	if ($db_data_reve['pseudo_id'] >= 1)
    	{
    	echo ", <a href=\"reveur-infos.php?pseudo_id=".$db_data_reve['pseudo_id']."\">".$db_data_reve['pseudo_inscrit']."</a>";
    	}
    	else
    	{
    	echo ", ".$db_data_reve['pseudo'];
    	}
    	echo " a confié le rêve suivant à la boîte à rêves :</p>
        <p class=\"reve\">".$db_data_reve['reve']."</p>
    Le problème est le suivant :
    - Si le rêve a été rédigé par un membre inscrit, toutes les infos de la page s'affichent sans problème (et le pseudo affiché est bien "pseudo_inscrit" !).
    - Sinon aucune info ne s'affiche, mais il n'y a pas pour autant d'erreur SQL détectée.

    Pourriez-vous m'aider à règler ce petit problème svp ?

    ps : je ne sais pas si il s'agit d'une erreur php ou SQL mais comme il n'y a pas d'erreur SQL détectée je poste ce message dans le forum php.[/code]

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 109
    Par défaut
    Petite précision : si le rêveur n'est pas membre inscrit son pseudo_id est égal à 0. D'où le ">= 0".

  3. #3
    Membre chevronné Avatar de papyphp
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 438
    Par défaut
    Bonsoir Yazerty,

    Pour moi ton problème vient de là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND RRVR.id = RR.pseudo_id
    Tu imposes que le reveur aie une id dans la table des rêveurs or tu leur donne la possibilité de n'en pas avoir.

    Je pense que tui devrais utiliser LEFT JOIN .

    [edit] je retire ce que je viens de dire suite à ta précision

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 109
    Par défaut
    Je n'avais pas identifié de possible problème à ce niveau là mais effectivement ! Et ta remarque reste d'actualité, même après ma précision ! Merci pour cette remarque !

    La requête ainsi formulée ne sélectionne en effet les données que si il y a un id dans la table reves_reveurs correspondant au pseudo_id du rêve enregistré dans la table reves_reves.

    ...Et l'id "0" n'existait pas dans la table reves_reveurs !

    J'ai donc créé un id "0" dans la table reves_reveurs. Il ne sert à rien mais permet à la requête de marcher quelque soit la situation du rêveur (inscrit ou pas).

    Mais est-ce que cette solution est la plus efficace :- ?

    ps : ma version MySQL est la 4.0.17 (si cela a une importance pour les éventuelle améliorations de requêtes...).

Discussions similaires

  1. sql dynamique fonctions qui prend en parametre une table
    Par cedro dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 27/07/2011, 09h33
  2. Réponses: 13
    Dernier message: 29/01/2008, 15h28
  3. [SQL] un create table qui devrait fonctionner
    Par klerdesign dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 28/06/2006, 14h05
  4. Alter table qui ne passe...
    Par Gential dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 04/06/2003, 17h48

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