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 :

recuperer les valeurs de plusieurs tables


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
    Septembre 2008
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 202
    Par défaut recuperer les valeurs de plusieurs tables
    Bonsoir à tous,
    J’ai une base de donnée avec des membres …

    exemple de ma table membre.sql

    ID – NOM – PRENOM – PAYS
    _______________________________________________

    1 – riri – lolo – 1
    2 – toto – coco – 1
    3 – fafa– nini – 3

    Ma table pays est celle-ci

    ID – Nom_Pays
    _________________________________________________
    1 – France
    2 – Belgique
    3 – Suisse

    lorsque j’appelle les membres dans une pages membres.php

    Je n’arrive pas à affiché les pays des membres …, je vois que leur id équivalent , voici comment j’appelle les éléments dans ma pages membres.php

    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_option = mysql_query("Select * from membre");
    while ($sl = mysql_fetch_array($sql_option)) { 
     
    $id = $sl["id"];
    $nom = $sl["nom"];
    $prenom = $sl["prenom"];
    $pays = $sl["pays"];
     
    ?>
     
     
    <? echo("
        <tr>
        <td bgcolor='efefef'>$nom</td>
        <td bgcolor='efefef'>$prenom</td>
        <td bgcolor='efefef'>$pays</td>
      </tr>
      ");
    } ?>

  2. #2
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    Il faut une jointure de table (c'est le principe du SGBDR).
    Exemple :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT m.id, m.nom, m.prenom, p.nom_pays
    FROM membres m
    JOIN pays p ON m.pays = p.id
    Pour info, m et p sont des alias de tables.
    Aussi, rien t'obliges à nommer "nom_pays" de la table "pays", tu peux la nommer "nom". Grâce aux alias on évite l'ambiguïté qu'il peu avoir sur un même nom sur 2 tables (ou plus).


    Admettons que ce soit nommé "nom" (au lieu de nom_pays dans "pays).
    Exemple :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT m.id, m.nom, m.prenom, p.nom AS nom_du_pays
    FROM membres m
    JOIN pays p ON m.pays = p.id
    Ici c'est rajouté un alias pour le champ "nom" du pays.
    Pour exploiter ces données : "nom" sera pour le nom du membre, et "nom_du_pays" sera pour le nom du pays.


    Il vaut mieux éviter de faire des SELECT * (tout sélectionner), ça peu provoquer une erreur SQL dû à une ambiguïté, ou alors il sera difficile de faire le distinguo entre 2 champs de même nom.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 202
    Par défaut
    Bonjour et merci pour votre aide ...

    j'arrive a comprendre jusqu’à ce point ...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql_option = mysql_query("Select * from membre");
    dans mon exemple j'ajoute ça

    $sql_option = mysql_query("Select * from membre join pays on Nom_Pays = id");

    ça me fait erreur de ce type,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in
    Merci

  4. #4
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Modifie comme ceci : (un die pour afficher l'erreur SQL)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql_option = mysql_query("Select * from membre join pays on Nom_Pays = id") or die('Erreur : '.mysql_error());
    Il a de très forte chance que l'erreur retourne sera lié à une ambiguïte.

    Le champ id ce trouve dans 2 tables (même nom).
    Il faut mettre des alias pour préciser à quelle table on fait référence. MySQL ne va pas pouvoir deviner toute seule.

    Je t'es donné toutes les explications suivi d'exemples. (Tu n'en tiens pas compte).
    Je ne vois pas comment faire mieux.


    A savoir que les alias de tables est une syntaxe courte.
    La syntaxe de référence, de base si on peu dire c'est cela : (sans alias)
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT table1.champA
    FROM table1
    (nom_de_la_table.nom_du_champ).

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 202
    Par défaut
    Effectivement je reçois l'erreur dont vous avez cité ...

    si je comprends bien ma table membre et pays on aussi pour chacun une valeur en id dont le conflit c'est bien ça ?

    lorsque vous avec introduit l'alias dans la requête php dans votre exemple ...
    on dois aussi changer les valeurs dans notre table sql ?

    Merci

  6. #6
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    si je comprends bien ma table membre et pays on aussi pour chacun une valeur en id dont le conflit c'est bien ça ?
    Non, j'ai jamais évoqué de problème de valeurs.
    C'est le nom des champs (id) qui sont communs/identiques dans 2 tables.
    Champ id table "membre" et champ id table "pays".


    Mais il y a rien à modifier, qu'il y ait des noms de champs identiques dans plusieurs tables n'est pas un problème, ni mêrme pour les valeurs, les alias permettent justement d'indiquer à MySQL à quelle table on fait référence, c'est que je n'est cessé d'expliqué.

    Quand on fait : FROM membres m -> On créer un alias m qui est une manière plus courte de nommer "membre".
    Puis dans le SELECT quan on fait ceci : SELECT m.id -> On précise à MySQL que ce champ "id" correspondra à la table "membre".

    Si ici on souhaite avoir non seulement la valeur du champ "id" de la table membre et aussi la valeur du champ "id" de la table "pays", alors non seulement il faudra indiquer à MySQL à quelle table on fera référence mais aussi définir un alias différent au ninveau du nom, au moins à l'un des deux.

    Si on fait ça par exemple :
    Ca ne causera pas de problème pour exécuter la requête, mais on risque d'avoir un problème pour la récupération des ces 2 données.
    Donc on va définir un nom différent à l'un des deux avec un alias de champ.
    On fera alors comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT m.id, p.id AS p_id
    Le champ "id" contiendra la valeur de l'id du membre (rien a changé pour ce champ)
    Le (nouveau) champ "p_id" contiendra la valeur de l'id du pays (un alias p_id a été défini pour renommer).
    Plus d'ambiguïté aussi bien pour l'exécution de la requête que pour l'exploitation des données après.


    Fais des essais pour mieux voir, (dans PhpMyAdmin directement par exemple).

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 202
    Par défaut
    Toujours dans le même projet, j'ai une liste de pays, dans un menu deroulant ..., a l'inscription du membre, on defini le pays ..., jusqu'a la pas de soucis ...

    Lorsque on veux mettre le membre a jour, *dans la page edit.php?id=1 *(ex)
    ...*

    Comment on peux faire en sorte de recuperer dans le menu deroulant le pays qu'on avais choisi au preable ...,*

    Car quand je modifie le nom par exemple, le pays se modifie aussi et prends la tete de liste ..., *il faut faire en sorte que le pays son direct celui de l'inscription si y a neccessaire de modifier on le pourra aussi*

    Pouvez vous me donne une piste svp ?

    Merci *

  8. #8
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Il suffit de poser l'attribut selected sur l'option en question:

    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    $data = array('a' => 1, 'b' => 2, 'c' => 3);
     
    $selected = 'b'; // récupéré sur $_POST ou $_GET
     
    // some stuff...
     
    ?>
    <select name="xxx">
      <?php foreach ($data as $key => $value): ?>
      <option <?=$key == $selected ? 'selected="selected"' : ''?> value="<?=$value?>"><?=$key?></option>
      <?php endforeach ?>
    </select>

  9. #9
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Post le code que tu as pour cette partie là (le menu déroulant), ça sera plus simple pour montrer comment ça se fait à mon sens.

    Vite fait, c'est un code HTML à rajouter dans la balise <option> lorsque le Pays correspond.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <select name="pays">
        <option value="1">France</option>
        <option value="2" selected="selected">Belgique</option>
        <option value="3">Suisse</option>
        ... etc ...
    </select>
    Dans cet exemple ce sera la Suisse qui sera sélectionnée (par défaut)
    En somme, rajouter : selected="selected" pour le Pays concerné (il faut en mettre qu'un seul).

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 202
    Par défaut
    Salut

    voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <select name="n_country">
    <?
    $sql_option = mysql_query("Select * from u_country");
    while ($sl = mysql_fetch_array($sql_option)) { 
    $id_cat = $sl["id"];
    $n_country = $sl["n_country"];
    echo("<option value='$id_cat'>$n_country</option>");
    } ?></select>
    j'essaye de regarder votre code
    merci

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 202
    Par défaut
    j'ai tenter cela, mais ça ne va pas apparamenet ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <select name="n_country">
    <?
    $sql_option = mysql_query("Select * from u_country");
    while ($sl = mysql_fetch_array($sql_option)) { 
    $id_cat = $sl["id"];
    $n_country = $sl["n_country"];
    if ($id_cat == $n_country) {
    $selected = "selected";
    }
    echo("<option value='$id_cat' $selected>$n_country</option>");
    } ?></select>

  12. #12
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Au passage, c'était pas une bonne idée de n'avoir pas donné les vrais noms de tables et champs que tu avais, ça nous oblige à relire plusieurs tes codes pour faire une gymnastique ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select  m.id, m.name, m.fname, m.company, p.n_country from u_member m join u_country p ON m.n_country = p.id
    Bon, "u_country" c'est les pays, et la clé primaire c'est : id
    Coté membres c'est la table "u_member" et la clé étrangère pour le pays c'est : n_country

    Franchement, renommer tes champs ainsi serait plus logique et devrait améliorer la compréhension à mon sens.
    Table "u_member" : id_membre | lastname | firstname | company | id_country
    Table "u_country" : id_country | name |
    Ce qui donnerait une requête comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT  m.id_member, m.lastname, m.firstname, m.company, p.id_country, p.name
    FROM u_member m join u_country p ON m.id_country = p.id_country

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $id_cat = $sl["id"];
    $n_country = $sl["n_country"];
    if ($id_cat == $n_country)
    Faut être logique.
    Pour sectionner le pays d'1 utilisateur en particulier, il faut faire les comparaisons avec la valeur de l'identifiant du pays de cet utilisateur.
    Cette donnée là n'apparait nulle part dans cette condition (code ci-dessus).
    D'ailleurs, le champ "n_country" ne se trouve pas dans cette table "u_country" (mais dans la table membre).
    Php devrait retourner une erreur du fait que ce champ n'existe pas, non ?

    Aussi, je t'avais conseillé de ne jamais faire de SELECT *, mais de mettre explicitement le nom des champs que l'on veut récupérer, et uniquement.
    En faisant : SELECT p.id, p.country FROM u_country
    tu aurais vu de suite ce problème de nom.
    (d'ailleurs, "Nom_Pays" était le nom du champ des pays, mais maintenant on ne sait plus, j'ai supposé que c'est : "country").


    Pour éditer un membre, tu as dû faire une requête SQL sélectionnant ce membre, et entre autre y mettre ce champ "n_country".
    Il faut faire la comparaison avec la valeur de ce champ là de cet utilisateur là.
    Quelque chose comme : (en partant du principe que $membre est le tableau contenant les données du membre)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // Comparaison entre l'identifiant du pays du membre et l'identifiant du pays en court
    if ($membre['n_country'] == $sl['id']) {
        $selected = "selected";
    }
    On récupérera la valeur du pays sélectionné avec $_POST['n_country'] (ou $_GET) pour mettre à jour le pays.


    En espérant de ne pas me tromper.

Discussions similaires

  1. Réponses: 5
    Dernier message: 22/11/2010, 18h20
  2. Sélectionner les valeurs de plusieurs tables différentes ?
    Par beegees dans le forum Langage SQL
    Réponses: 7
    Dernier message: 31/03/2009, 14h06
  3. [Tableaux] Recuperer les valeurs de plusieurs checkbox
    Par tomenbois dans le forum Langage
    Réponses: 9
    Dernier message: 18/03/2008, 12h23
  4. Réponses: 2
    Dernier message: 24/08/2007, 14h25
  5. Réponses: 9
    Dernier message: 20/08/2007, 14h07

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