Alternance des couleurs et affichage de données étrangères

Eléphant du PHP | 179 Messages

04 août 2005, 10:51

Bonjour à tous.

J'ai un script pour une interface destinée à l'administrateur de la base. Ce script est censé afficher le contenu de ma table "sociétés" sous la forme d'un tableau dynamique avec alternance des couleurs.

J'ai deux problèmes:
1. L'alternance des couleurs ne se fait pas.
2. Dans ma table société, il existe un champ appelé 'RefGroupe': il s'agit de l'identifiant d'une autre table ("groupes"). Seulement il m'affiche l'identifiant jusqu'à présent mais je voudrais que ce soit le nom. J'avais réglé le problème mais j'ai effacé par mégarde le script :roll:

Merci pour votre aide.
<h2><center><a name="debut">  Affichage des sociétés </a></center></h2>
<br>

<?php
$couleur1 = '#ffcc00';
$couleur2 = '#ffffe0';
?>

<table class="tableau">
<table width=2000 rules="cols" border=0 cellspacing=0 cellpadding=10>

<!-- titres-->

<tr bgcolor="<?php echo $couleur1; ?>">
<td><b>Id</b></td>
<td><b>Nom</b></td>
<td><b>Autre nom</b></td>
<td><b>Groupe</b></td>
<td><b>Spécialité</b></td>
<td><b>Présentation</b></td>
<td><b>Inf.compl.</b></td>
<td><b>Pays d'origine</b></td>
<td><b>Adresse</b></td>
<td><b>Tel</b></td>
<td><b>Fax</b></td>
<td><b>Site société </b></td>
<td><b>NomReprFr </b></td>
<td><b>AdresseReprFr</b></td>
<td><b>TelReprFr</th>
<td><b>FaxReprFr </b></td>
</tr>


<?php
#connection à la base et sélection de la table et des champs#
	$lien = mysql_connect("xx","xx","xx");
	mysql_select_db("xx", $lien);

	$requete="SELECT IdSociete, NomSociete, AutreNomSociete, RefGroupe, Specialite, Presentation, InfCompl, PaysOrigine, Adresse, Tel, Fax, SiteSociete, NomReprFr, AdresseReprFr, TelReprFr, FaxReprFr
	FROM societes ORDER BY IdSociete";
	$result=mysql_query($requete);


$cptCouleur = 1;
while ($val=mysql_fetch_array($result))
{
$couleur = ($cptCouleur % 2 == 0)?$couleur1:$couleur2;
?>

<tr bgcolor="<?php echo $couleur; ?>">	
<td> <?php print ($val["IdSociete"]);?> </td>
<td> <?php print ($val["NomSociete"]);?> </td>
<td> <?php print ($val["AutreNomSociete"]);?> </td>
<td> 
<?php
#connection à la base#
	$lien = mysql_connect("xx","xx","xx");
	mysql_select_db("xx", $lien);

#affichage du nom du groupe#
	$requete2="SELECT * FROM groupes"; 
	$result2=mysql_query($requete2);
while ($val2=mysql_fetch_array($result2))
{
	if ($val2["IdGroupe"] == $RefGroupe)
	{ 
		print ('');
?>
<?php print ($val2["NomGroupe"]);?> 
<?php 
	}
}

mysql_close($lien);
?> 
</td>
<td> <?php print ($val["Specialite"]);?> </td>
<td> <?php print ($val["Presentation"]);?> </td>
<td> <?php print ($val["InfCompl"]);?> </td>
<td> <?php print ($val["PaysOrigine"]);?> </td>
<td> <?php print ($val["Adresse"]);?> </td>
<td> <?php print ($val["Tel"]);?> </td>
<td> <?php print ($val["Fax"]);?> </td>
<td> <?php print ($val["SiteSociete"]);?> </td>
<td> <?php print ($val["NomReprFr"]);?> </td>
<td> <?php print ($val["AdresseReprFr"]);?> </td>
<td> <?php print ($val["TelReprFr"]);?> </td>
<td> <?php print ($val["FaxReprFr"]);?> </td>
</tr>


<?php
}
mysql_close($lien);
?>

</table>

<h4><center><a href="#debut">Haut de la page</a></center></h4>
</body></html>
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

04 août 2005, 10:54

- il manque l'incrémentation de $cptCouleur à la fin de la boucle
- la deuxième connexion à la Bdd est inutile
- pour récupérer le nom, tu dois faire une jointure entre "societe" et "groupes"

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

04 août 2005, 10:56

tu peux sélectionner toutes tes infos en une seule requête :

Code : Tout sélectionner

SELECT IdSociete, NomSociete, AutreNomSociete, RefGroupe, NomGroupe, Specialite, Presentation, InfCompl, PaysOrigine, Adresse, Tel, Fax, SiteSociete, NomReprFr, AdresseReprFr, TelReprFr, FaxReprFr FROM societes s, groupes g WHERE s.RefGroupe = g.RefGroupe ORDER BY IdSociete";
c'est ça, une jointure :)

Eléphant du PHP | 179 Messages

04 août 2005, 11:21

Bon c'est pas gagné :lol:

Je trouve le principe de la jointure tout simplement genial :love1:
Si je comprends le principe, je peux interroger n'importe quel champ de ma table groupe grâce à cette méthode? Ou bien est-ce un peu plus compliqué?

Pour les couleurs, j'ai mis la ligne manquante mais je ne sais pas encore si c'est au bon endroit.

En effet, je ne peux pas vérifier car il ne reconnaît plus mon "fetch_array".

Voici le code tel qu'il se présente:

<?php
$couleur1 = '#ffcc00';
$couleur2 = '#ffffe0';
?>

<table class="tableau">
<table width=2000 rules="cols" border=0 cellspacing=0 cellpadding=10>

<!-- titres-->

<tr bgcolor="<?php echo $couleur1; ?>">
<td><b>Id</b></td>
<td><b>Nom</b></td>
<td><b>Autre nom</b></td>
<td><b>Groupe</b></td>
<td><b>Spécialité</b></td>
<td><b>Présentation</b></td>
<td><b>Inf.compl.</b></td>
<td><b>Pays d'origine</b></td>
<td><b>Adresse</b></td>
<td><b>Tel</b></td>
<td><b>Fax</b></td>
<td><b>Site société </b></td>
<td><b>NomReprFr </b></td>
<td><b>AdresseReprFr</b></td>
<td><b>TelReprFr</th>
<td><b>FaxReprFr </b></td>
</tr>

<?php
#connection à la base et sélection de la table et des champs#
	$lien = mysql_connect("xx",xx","xx");
	mysql_select_db("xx", $lien);

	$requete="SELECT IdSociete, NomSociete, AutreNomSociete, RefGroupe, Specialite, Presentation, InfCompl, PaysOrigine, Adresse, Tel, Fax, SiteSociete, NomReprFr, AdresseReprFr, TelReprFr, FaxReprFr
	FROM societes s, groupes g WHERE s.RefGroupe=s.IdGroupe ORDER BY IdSociete";
	$result=mysql_query($requete);


$cptCouleur = 1;
while ($val=mysql_fetch_array($result))
{
$couleur = ($cptCouleur % 2 == 0)?$couleur1:$couleur2;
?>

<tr bgcolor="<?php echo $couleur; ?>">	
<td> <?php print ($val["IdSociete"]);?> </td>
<td> <?php print ($val["NomSociete"]);?> </td>
<td> <?php print ($val["AutreNomSociete"]);?> </td>
<td> <?php print ($val["NomGroupe"]);?> </td>
<td> <?php print ($val["Specialite"]);?> </td>
<td> <?php print ($val["Presentation"]);?> </td>
<td> <?php print ($val["InfCompl"]);?> </td>
<td> <?php print ($val["PaysOrigine"]);?> </td>
<td> <?php print ($val["Adresse"]);?> </td>
<td> <?php print ($val["Tel"]);?> </td>
<td> <?php print ($val["Fax"]);?> </td>
<td> <?php print ($val["SiteSociete"]);?> </td>
<td> <?php print ($val["NomReprFr"]);?> </td>
<td> <?php print ($val["AdresseReprFr"]);?> </td>
<td> <?php print ($val["TelReprFr"]);?> </td>
<td> <?php print ($val["FaxReprFr"]);?> </td>
</tr>


<?php
$cptCouleur++; 
}
mysql_close($lien);
?>

</table>

<h4><center><a href="#debut">Haut de la page</a></center></h4>
</body></html>
Modifié en dernier par Elisa le 04 août 2005, 13:03, modifié 1 fois.
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

04 août 2005, 11:27

oui c'est bien là

mais il manque un guillemet ici : (deuxième xx)
 $lien = mysql_connect("xx",xx","xx"); 
c'est peut-être pour ça que ça ne marche plus
sinon si le mysql_fetch_array ne marche pas, c'est peut-être qu'il y aune erreur dans la requête, fais ceci pour afficher les erreurs MySQL :
$result=mysql_query($requete) or die(mysql_error());
Je trouve le principe de la jointure tout simplement genial love1
Si je comprend le principe, je peux interroger n'importe quel champ de ma table groupe grâce à cette méthode? Ou bien est-ce un peu plus compliqué?
tu peux interroger tout ce que tu veux, il faut simplement un champ qui relie deux tables pour avoir les correspondances

Code : Tout sélectionner

Societes ---------- id_societe ---> clé primaire nom_societe id_groupe ---> clé étrangère Groupes ---------- id_groupe ----> clé primaire nom_groupe
ici tu peux connaitre le groupe d'une société car chaque ligne possède une clé étrangère vers la table groupe

cet exemple est pour le cas où 1 société ne peut appartenir qu'à 1 et 1 seul groupe

Eléphant du PHP | 179 Messages

04 août 2005, 11:30

mais il manque un guillemet ici : (deuxième xx)
$lien = mysql_connect("xx",xx","xx"); 
c'est peut-être pour ça que ça ne marche plus
Non, ça c'est parce que j'ai effacé mes mots-clés pour le forum :-"
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

04 août 2005, 11:32

j'ai édité en rajoutant une ligne pour afficher les éventuelles erreurs MySQL

Eléphant du PHP | 179 Messages

04 août 2005, 11:34

cet exemple est pour le cas où 1 société ne peut appartenir qu'à 1 et 1 seul groupe
Mes tables sont de un à plusieurs:

un groupe peut avoir plusieurs sociétés
mais une société ne peut appartenir qu'à un seul groupe
une société peut avoir plusieurs produits
mais un produit ne peut être fabriqué que par une société.

Ca fonctionne quand même? Parce que, si je me souviens bien de une relation (1,1) réclame une table intermédiaire?
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

04 août 2005, 11:37

cet exemple est pour le cas où 1 société ne peut appartenir qu'à 1 et 1 seul groupe
mais une société ne peut appartenir qu'à un seul groupe
Ca fonctionne quand même?
à mon avis oui :lol:
Parce que, si je me souviens bien de une relation (1,1) réclame une table intermédiaire?
non, c'est une cardinalité 1,n
à partir du moment où tu as 1,1 d'un coté de la relation tu peux passer l'identifiant de l'entité but, dans l'entité source (ou l'inverse je ne sais plus comment on dit :oops: )
et la table intermédiaire en question s'appelle une relation ;)

Eléphant du PHP | 179 Messages

04 août 2005, 11:45

Bon j'ai compris il trouve mon champ 'Presentation' ambigü car c'est un champ qui se retrouve aussi dans la table Groupe. J'ai tenté de l'écrire comme ça:

Code : Tout sélectionner

<td> <?php print ($val["s.Presentation"]);?> </td>
Mais apparemment ce n'est pas la bonne méthode.
non, c'est une cardinalité 1,n
à partir du moment où tu as 1,1 d'un coté de la relation tu peux passer l'identifiant de l'entité but, dans l'entité source (ou l'inverse je ne sais plus comment on dit Embarassed )
et la table intermédiaire en question s'appelle une relation Wink
Je pérore peut être mais il me semble:
cardinalité (1,1) => rassembler en une seule table
cardinalité (1, n) => Table1:IdTable = Table2:RefTable
cardinalité (n,n) => Table1 -> Table de relation <- Table 2
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Eléphant du PHP | 179 Messages

04 août 2005, 12:13

Alors voilà, j'ai réglé le problème en partie:
$requete="SELECT IdSociete, NomSociete, AutreNomSociete, RefGroupe, Specialite, s.Presentation, s.InfCompl, PaysOrigine, Adresse, Tel, Fax, SiteSociete, NomReprFr, AdresseReprFr, TelReprFr, FaxReprFr
	FROM societes s, groupes g WHERE s.RefGroupe=g.IdGroupe ORDER BY IdSociete";
J'avais fait une erreur dans la requête. Et puis comme mes champs présentation et Informations complémentaires sont les mêmes dans mes deux tables, il y a vait ambiguïté.

MAIS pour l'affichage, j'ai tenté ceci dans un premier temps:
<td> <?php print ($val["NomGroupe"]);?> </td>
Puis j'ai tenté:
<td> <?php print ($val["g.NomGroupe"]);?> </td>
Puis je suis revenue à :
<td> <?php print ($val["RefGroupe"]);?> </td>
Et mon NOM de groupe ne s'affiche toujours pas...
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

04 août 2005, 12:34

quand il y a ambiguïté de champ, il suffit de préciser de quelle table tu le prend oui
et tu peux donner toi-même un nom de "sortie" si le nom n'est pas exploitable directement ou trop long/compliqué, ceci avec AS

exemples :

Code : Tout sélectionner

SELECT NOW() AS date_du_jour; SELECT (SUM(notes) / (COUNT(notes)) AS moyenne FROM bulletin
"date_du_jour" et "moyenne" pourront être utilisés comme index du tableau renvoyé par mysql_fetch_array

donc tu peux utiliser cette solution pour ta requête, mais dans celle que tu as collé dans ton message précédent tu ne sélectionnes plus le nom du groupe c'est normal ?
Je pérore peut être mais il me semble:
cardinalité (1,1) => rassembler en une seule table
cardinalité (1, n) => Table1:IdTable = Table2:RefTable
cardinalité (n,n) => Table1 -> Table de relation <- Table 2
je ne suis pas d'accord :
1 - si tu as au moins une cardinalité 1,1, tu passes l'identifiant de l'entité source dans l'entité but (rassembler ou non dans une seule table n'a rien à voir)
2 - si tu as 2 cardinalités 1,n ou n,n : relation (table intermédiaire)

Mammouth du PHP | 543 Messages

04 août 2005, 12:36

NomGroupe n'est pas dans la listes des champs récupérés par la requete...

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

04 août 2005, 12:41

cas 1 : 1 étudiant n'appartient qu'à 1 ou 1 seul club : Etudiants 1,1 <----> 0,n Clubs
1.A

Code : Tout sélectionner

Etudiants --------- id_etudiant nom_etudiant club --> tu mets directement le nom du club
1.B

Code : Tout sélectionner

Etudiants --------- id_etudiant nom_etudiant id_club ---> clé étrangère vers la table Clubs Clubs ----- id_club nom_club
ces deux solutions fonctionnent, mais la deuxième est un peu plus pratique puisque si le club "Echecs" change de nom pour devenir le club "Jeux de société", tu ne changes le nom qu'une seule fois
dès lors que tu as des valeurs qui se répétent, parmis un choix de quelques possibilités seulement, crée une nouvelle table

2 : 1 étudiant peut appartenir à 1 ou plusieurs clubs : Etudiants 1,n <---> 0,n Clubs

Code : Tout sélectionner

Etudiants --------- id_etudiant nom_etudiant Clubs ----- id_club nom_club est_membre ---> relation ---------- id_etudiant ---> clé étrangère id_club ----> clé étrangère
oui dans mon exemple un étudiant est obligé d'appartenir à un club sous peine de renvoi :lol:

Eléphant du PHP | 179 Messages

04 août 2005, 12:50

NomGroupe n'est pas dans la listes des champs récupérés par la requete...
Non c'est vrai... Mais est-ce que j'ai le droit de mélanger allègrement les champs de ma table "sociétés" à ceux de ma table "groupes"?
je ne suis pas d'accord :
1 - si tu as au moins une cardinalité 1,1, tu passes l'identifiant de l'entité source dans l'entité but (rassembler ou non dans une seule table n'a rien à voir)
2 - si tu as 2 cardinalités 1,n ou n,n : relation (table intermédiaire)
Alors cela signifie que ma base est fausse :shock: mais pourtant j'ai eu l'occasion de la soumettre à mon enseignant et à un informaticien. Tous deux disaient la même chose... Mais je réalise qu'on dit peut-être la même chose mais pas avec le bon vocabulaire (de mon côté) :)
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!