Problème de jointure entre 2 tables

Répondre
elisa
le 25/10/2010 à 12:06
elisa
Bonjour.

J'apprends depuis peu le langage PHP à travers des livres et les forums sur internet.
J'ai installé le script espace membre de la rubrique "Les comment faire" sur mon site et celui-ci fonctionne bien ainsi que la messagerie interne.
Je souhaite maintenant ajouter une page profil membre et pour cela j'ai crée une nouvelle table dans la bdd sous le nom "formulaire"

La table formulaire est celle-ci :
id, civilite, age, pays, region, profession, loisirs, citation, message

J'ai créer un formulaire HTML et une page traitement afin d'insérer les infos du membre dans la table formulaire et cela fonctionne.

Afin de récupérer les infos de la table formulaire correspondant au login de la table membre, j'utilise la commande appropriée "SELECT" mais je n'arrive pas à faire la liaison entre le login de la table membre et l'id de la table formulaire.

Voilà la commande :
$sql = 'SELECT membre.login as id, civilite, age, pays, region, profession, loisirs, citation, message FROM membre, formulaire WHERE login = "'.$_SESSION['login'].'"';

J'ai parcouru les cours de PHP sur les jointures et j'ai tenté différentes formules mais rien ne fonctionne.

Pouvez-vous m'aider ?
Cordialement.
moogli
le 25/10/2010 à 14:03
moogli
salut,

pour répondre a la question : il faut ajouter la clef primaire de la table membre dans la table formulaire. la jointure ce fait sur cette clef (dit étrangère ;)).

sur le fond : il n'y a pas besoin d'une table en plus pour ces information. Celle ci peuvent très bien être ajouter à la table membre puisse qu'elles sont liée à un membre et unique (y a peut de chance qu'un membre utilise 4 adresses en même temps et limite on s'en fou ?).

Par contre il est possible d'avoir une table pays (afin de pas les remettres à chaque fois), une table régions et une table civilité (même si préfère un champ enum vu qu'il y en a 3).
Table membre
CREATE TABLE membre (
id int(11) NOT NULL auto_increment,
login text NOT NULL,
pass_md5 text NOT NULL,
civilite enum('Indéterminé ?','Mademoiselle','Madame','Monsieur') default 'Indéterminé ?' not null,
age smallint,
region smallint unsigned default 0,
profession varchar(100),
loisirs varchar(100),
citation varchar(150),
message varchar(150),
PRIMARY KEY (id)
) TYPE=MyISAM;

Table Pays
table pays
create table pays(
id smallint unsigned not null auto_increment,
nompays tinytext not null,
primary key(id)
)type=myisam;

Table regions
Table région
create table regions (
id smallint unsigned not null auto_increment,
idpays smallint unsigned not null,
nomregion tinytext not null,
primary key(id)
)type=myisam;

avec ces 3 tables tu peut déja prédéfinir les noms des pays et des régions (ce ne sont pas des choses qui change souvent, et même s'il en manque, tu peut ajouter un truc du genre ajouter un pays / région avec une demande de validation par un modo. perso j'utilise un champ enum(true/false) pour cela.

il te faudra utiliser les jointures pour afficher le tout
par exemple : select login,civilite,age,nompays,nomregion,profession,loisirs,citation,message from membre inner join regions on region=regions.id inner join pays on regions.idpays=pays.id where membre.id='1';

a savoir : je n'ai pas mis le id pays dans la table membre pour qu'il n'y ai pas de redondance avec la table region (puisse que j'associe une région à un pays et je laisse ainsi la possibilité d'avoir un pays avec des régions ayant le même nom).

c'est plus compliqué mais cela permet d'avoir une iterface plus simple pour l'utilisation
- pré sélection de nom très courant pour le membre
- plus simple d'administration (plus besoin faire le tour de tous les membre qui ont mis grosland en pays (avecd des orthographes diverse en focntion de la casse, une simple suffit pour supprimer ;) ).

je sais ça fait beaucoup mais au final c'est plus simple à maintenir ;)

@+
Il en faut peu pour être heureux !!!!!
elisa
le 25/10/2010 à 14:37
elisa
Merci.

En fait, ma 1er idée était bien d'ajouter les colonnes à la tables membre mais celles-ci, une fois ajouter, bloquées l'inscription des membres, je ne sais pour qu'elle raison d'ailleurs.

Je vais ajouter les colonnes et les tables et je reviens vers vous :--)
moogli
le 25/10/2010 à 16:27
moogli
il faut ajouter le nom des champs dans la requête insert de l'espace membre.

lorsque l'on fait : insert into table values( ....) Mysql s'attend a ce que tous les champs de la table soit renseigné, du coup il y a une erreur quand c'est le cas (comme ici puisque les champs ont étaient ajouté à posteriori).

il faut modifier la requête ainsi : insert into table (champ1,champ3 etc) values ( valeur des champs).

Il faut donc modifier les requêtes insert du code de la globule pour ajouter les noms des champ de tables qu'il renseigne, et ceci sans pour autant modifier le reste du code :d

@+
Il en faut peu pour être heureux !!!!!
elisa
le 28/10/2010 à 09:28
elisa
Bonjour :)

Voilà, j'ai installé WAMP afin de travailler en local.

Finalement, j'utilise une seule table, la table membre avec id, login, pass_md5, email, civilite, age, pays, région, profession, message (pour l'instant c'est plus simple pour moi). J'ai modifié les champs et valeur de la commande insert into.

J'ai tenté avec les 3 tables mais je n'ai pas réussi à faire fonctionner le tout, alors j'ai testé avec 1 table et cela fonctionne bien. Maintenant, il y à dans l'espace membre, une page liste des membres ou l'on peut consulter les profils et une page qui permet de modifier ses infos.

Par contre, L'utilisation en local de la table "messages", ne fonctionne pas, quand j'insère la table, la page "membre" est vide alors j'ai supprimé les codes PHP correspondant à la messagerie pour tester et là, la page s'affiche de nouveau. Alors je fais sans.

Bref, tout cela pour vous dire que je rencontre encore un souci qui j'imagine bien, ne sera pas le dernier :--)

L'inscription se déroule très bien, j'accède à l'espace membre, je navigue dedans, je teste toutes les pages, tout est nikel.
Le problème vient de la connexion. Je ne peux plus me connecter, impossible. je ne peux que m'inscrire :(

Je regarde la page index et membre mais rien ne me saute aux yeux.

Avez-vous une idée ? Si vous avez besoin de voir le code d'une page, je vous l'affiche sans problème.

Merci bien.
moogli
le 28/10/2010 à 11:23
moogli
as tu vérifiée le code de connexion ?

autre question : comment fait tu pour ne pas avoir des gens habite en France ou en france ou en FrAnCe etc ?

pour ce qui est de la messagerie, vue qu'elle est lié à l'espace membre il est possible que le changement de table apporte des soucis (j'ai pas regardé la source il faut bucher sur les requete SQL voir si cela géne ou pas).

@+
Il en faut peu pour être heureux !!!!!
elisa
le 28/10/2010 à 11:53
elisa
Oui j'ai vérifié les pages. J'ai juste modifié insert into de la page d'inscription, je n'ai pas touché à la page index. J'ai supprimé le code PHP de la messagerie sur la page membre, peut être que le problème vient de là.

En ce qui concerne le pays, le membre choisit son pays à l'aide d'une liste déroulante et de même pour son âge. :)
elisa
le 30/10/2010 à 02:04
elisa
Bonsoir.

Juste pour vous dire que l'espace membre fonctionne très bien en ligne.

Merci pour votre aide.
moogli
le 31/10/2010 à 23:35
moogli
heu de rien :)

pour ce qui est des liste déroulante c'est tres bien mais il ne faut surtout pas s'y fier car les pages peuvent être modifiées (le html)et on donc par exemple ajouter phpland comme pays (ou 12,6 ans XD).

@+
Il en faut peu pour être heureux !!!!!
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours