Affichage d'une donnée de type [1,n]

Eléphant du PHP | 179 Messages

05 oct. 2005, 15:18

Bonjour à tous,

J'ai trois tables reliées entre elles comme suit.
Groupes --> IdGroupe
Sociétés --> IdSociete et RefGroupe
Produits --> IdProduit et RefSociete

Lorsque mon utilisateur consulte une fiche "société" par exemple, il accède via une URL à la fiche du groupe auquel appartient ladite société. De même, il peut accéder à la fiche du produit que propose cette société.

La navigation d'une fiche à une autre se fait sans problème.
Mais ça devient plus compliqué dès lors qu'un groupe a plusieurs sociétés et une société plusieurs produits. Dès que j'assigne un produit supplémentaire à une société, il remplace le produit précédent au lieu de me les afficher en totalité.

Si vous avez une explication, je suis toute ouïe. :) Merci par avance.

Voici une partie de mon code qui sert à afficher une société, le nom du groupe auquel elle est affiliée et les noms de ses produits:
<?php 
//Récuperation de l identifiant de la donnée//
$IdSociete = $_GET['IdSociete'];
?>


<input type="hidden" name="IdGroupe" value="<? echo $IdSociete;?>">

<?php 
//Connection à la base//
$lien = mysql_connect("xx","xx","xx");
mysql_select_db("xx", $lien);

// Sélection des tables//
$requete1="SELECT s.IdSociete, s.NomSociete, s.AutreNomSociete, s.RefGroupe, p.IdProduit, p.NomProduit, 
	s.Specialite, s.Presentation, s.InfCompl, s.PaysOrigine, s.Adresse, s.Tel, s.Fax, s.SiteSociete, 
	s.NomReprFr, s.AdresseReprFr, s.TelReprFr, s.FaxReprFr, s.MAJ
	FROM societes s
	LEFT OUTER JOIN produits p ON s.IdSociete=p.RefSociete
	WHERE IdSociete='".$IdSociete."'";
$result1=mysql_query($requete1);

$NomSociete = mysql_result($result1,0,'NomSociete');
$AutreNomSociete = mysql_result($result1,0,'AutreNomSociete');
$RefGroupe = mysql_result($result1,0,'RefGroupe');
$IdProduit = mysql_result($result1,0,'IdProduit');
$NomProduit = mysql_result($result1,0,'NomProduit');
$Specialite = mysql_result($result1,0,'Specialite');
$Presentation = mysql_result($result1,0,'Presentation');
$InfCompl = mysql_result($result1,0,'InfCompl');
$PaysOrigine = mysql_result($result1,0,'PaysOrigine');
$Adresse = mysql_result($result1,0,'Adresse');
$Tel = mysql_result($result1,0,'Tel');
$Fax = mysql_result($result1,0,'Fax');
$SiteSociete = mysql_result($result1,0,'SiteSociete');
$NomReprFr = mysql_result($result1,0,'NomReprFr');
$AdresseReprFr = mysql_result($result1,0,'AdresseReprFr');
$TelReprFr = mysql_result($result1,0,'TelReprFr');
$FaxReprFr = mysql_result($result1,0,'FaxReprFr');
$MAJ = mysql_result($result1,0,'MAJ');

mysql_close($lien);
?>

<br />
<h1><?php echo $NomSociete;?></h1>
<br />

<table >
  <tbody>

<tr>
	<td >
	Nom de la société :
	</td>
	<td>
			<?php echo $NomSociete;?>
	</tr>


<tr>
	<td
	Nom du groupe :
	</td>
<?php  
//Connection à la base
$lien = mysql_connect("xx","xx","xx");
mysql_select_db("xx", $lien);

//Afficher le nom du groupe
$requete2="SELECT IdGroupe, NomGroupe, AutreNomGroupe, Presentation, InfCompl, MAJ
FROM groupes";
$result2=mysql_query($requete2);
while ($val2=mysql_fetch_array($result2))
	{
	if ($val2["IdGroupe"] == $RefGroupe)
	{ 
		print ('');
?>

          <td>
<a href="aff_rechgroupes.php?IdGroupe=<?php print ($val2["IdGroupe"]);?>"><?php echo $val2["NomGroupe"];?></a>
<?php 
}
}
mysql_close($lien);
?>
			</select> 
		
	</td>
</tr>
<tr>
	<td>
	Produit(s) :
	</td>
	<td>
<a href="aff_rechproduits.php?IdProduit=<?php echo $IdProduit;?>"><?php echo $NomProduit;?></a>
	</td>
</tr>
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Mammouth du PHP | 19672 Messages

05 oct. 2005, 15:35

Ton code est bizarre: tu as un </select> qui ne ferme rien du tout et il n'y a pas de formulaire.

Pour les produits, de la manière dont tu récupères les données en début de code, tu ne peux avoir qu'un seul produit.

Pour avoir tous les produits d'une société, il faudrait une requête sur les produits avec l'identifiant de la société et une boucle comme tu as fait pour lister les sociétés
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 179 Messages

05 oct. 2005, 16:26

Le select est un oubli en raison du remaniement des scripts.

J'ai créé une troisième requête qui ressemble à ça:
<?php  
//Connection à la base//
$lien = mysql_connect("xx","xx","xx");
mysql_select_db("xx", $lien);

//Affichage du nom du groupe//
$requete3="SELECT IdProduit, NomProduit, RefSociete, DisciplinesBases, TypeBases, TypeAcces,
		Presentation, TypeRecherche, Site, MAJ
		FROM produits
		WHERE IdProduit='".$IdProduit."'";
$result3=mysql_query($requete3);
while ($val3=mysql_fetch_array($result3))
	print ('');
?>

<td style="text-align: justify;">
		<span style="font-size: 10pt; font-family: Arial,sans-serif;">
			<a href="aff_rechproduits.php?IdProduit=<?php echo $IdProduit;?>"><?php echo $NomProduit;?></a>
<?php 

mysql_close($lien);
?>
Il m'affiche toujours un produit unique. Et il écrase l'autre produit à l'affichage. Je m'explique:
Lorsque l'utilisateur veut consulter une fiche "société", il sélectionne la société en question dans un menu déroulant à choix unique. Lorsque j'enregistre plusieurs produits appartenant à une même société, le nom apparaît en double ou en triple dans le menu déroulant. Au début, je pensais que chaque produit créait une nouvelle fiche mais c'est toujours la même avec le dernier produit enregistré. :shock:
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Mammouth du PHP | 19672 Messages

05 oct. 2005, 16:29

Si tu fais une recherche de produit avec dans ta requête une clause précisant l'id d'un produit précis, tu n'auras qu'un seul produit à l'arrivée. Si tu veux tous les produits d'une société, alors ta clause de tri WHERE doit se faire sur l'id de la société et non sur celle du produit.

Regarde bien ta requête, tu verras que c'est logique de n'avoir qu'un seul produit.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 179 Messages

05 oct. 2005, 16:44

Si je fais ceci, il ne m'affiche plus rien.
<?php
$requete3="SELECT IdProduit, NomProduit, RefSociete, DisciplinesBases, TypeBases, TypeAcces, Presentation, TypeRecherche, Site, MAJ
		FROM produits";
$result3=mysql_query($requete3);
while ($val3=mysql_fetch_array($result3))
{
	if ($val2["IdSociete"] == "RefSociete")
	{ 
	print ('');
?>

<td style="text-align: justify;">
		<span style="font-size: 10pt; font-family: Arial,sans-serif;">
			<a href="aff_rechproduits.php?IdProduit=<?php echo $IdProduit;?>"><?php echo $NomProduit;?></a>
<?php 
	}
}
mysql_close($lien);
?>
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Mammouth du PHP | 19672 Messages

05 oct. 2005, 17:32

Je crois que tu devrais explorer le tuto que j'ai mis dans la FAQ sur les listes déroulantes liées : à mon avis, la première version (100% PHP) devrait résoudre en grande partie ton problème :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 179 Messages

06 oct. 2005, 09:42

Bonjour,
Suite à ton conseil et à ton tuto, j'ai essayé d'adapter tant bien que mal. Voici mon code tel qu'il se présente déormais:
<tr>
	<td style="text-align: justify; vertical-align: top; font-size: 11pt; font-weight: bold; font-family: Arial,sans-serif; color: #ff9900;">
	Produit(s) :
	</td>
<?php  
//Connection à la base//
$lien = mysql_connect("xx","xx","xx");
mysql_select_db("xx", $lien);

//Affichage des noms des produits//
$requete3="SELECT IdProduit, NomProduit, RefSociete, DisciplinesBases, TypeBases, TypeAcces, p.Presentation, TypeRecherche, Site, p.MAJ
		FROM produits p, societes s
		LEFT OUTER JOIN produits p ON s.IdSociete=p.RefSociete
		WHERE IdSociete='".$IdSociete."'
		ORDER BY NomSociete";
$result3=mysql_query($requete3);
//Un compteur pour les produits//
$NbProduits = 0;
// On crée un tableau pour les ID et les noms des produits//
$IdProduit = array();
$NomProduit = array();
//On parcourt le tableau pour sélectionner les bons noms//
while ($val3=mysql_fetch_assoc($result3))
{
	array_push($IdProduit, $val3['IdProduit']);
	array_push($NomProduits, $val3['NomProduit']);
	$NbProduits++;
}
?>

<td style="text-align: justify;">
		<span style="font-size: 10pt; font-family: Arial,sans-serif;">
			
<?php 
for ($Nb = 0; $Nb<$NbProduits; $Nb++)
	{
?>
<a href="aff_rechproduits.php?IdProduit=<?php echo ($IdProduit[$Nb]);?>"><?php echo $NomProduit[$Nb];?></a>
<?php 
	}
mysql_free_result($result3);
mysql_close($lien);
?>
		</span>
	</td>
</tr>
Il m'affiche deux erreurs:
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in c:\program files\easyphp1-8\www\sin051005\user\aff_societes.php on line 157
ce qui correspond à la ligne:
while ($val3=mysql_fetch_assoc($result3))
et
Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in c:\program files\easyphp1-8\www\sin051005\user\aff_societes.php on line 175
ce qui correspond à la ligne:
mysql_free_result($result3);
Si je comprends bien, il ne les reconnaît pas. Mais je ne comprends pas pourquoi.
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Mammouth du PHP | 19672 Messages

06 oct. 2005, 10:12

Ok, alors la seconde erreur découlant de la première, on va se limiter à celle-ci. Pour résoudre le problème, il te faut vérifier que la requête générée est correcte. Fais juste après la création de la requête un
echo($requete3);
Vois ensuite sur la page ce que ça affiche et si la requête a l'air correcte. Dans la foulée, copie cette requête générée et teste la directement dans phpMyAdmin pour avoir le retour exact, soit des données si c'est bon, soit un message d'erreur explicite.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 179 Messages

06 oct. 2005, 10:38

Lorsque je fais un echo de la requête, j'ai ceci
SELECT IdProduit, NomProduit, RefSociete, DisciplinesBases, TypeBases, TypeAcces, p.Presentation, TypeRecherche, Site, p.MAJ FROM produits p, societes s LEFT OUTER JOIN produits p ON s.IdSociete=p.RefSociete WHERE IdSociete='11' ORDER BY NomSociete
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in c:\program files\easyphp1-8\www\sin051005\user\aff_societes.php on line 158
Sous MyAdmin, il m'indique ceci:
MySQL a répondu:Documentation
#1066 - Table/alias: 'p' non unique
Je ne comprends pas parce que "p" est censé faire en sorte que chaque champ soit unique.

Par ailleurs, je crois que ma requête est illogique: si je veux que ce soient les noms des produits qui apparaissent, est-ce que je ne dois pas écrire WHERE IdProduit=$IdProduit ORDER BY NomProduit?
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

06 oct. 2005, 10:43

si je veux que ce soient les noms des produits qui apparaissent
tu dois SELECT nomproduit

ORDER BY te permet juste de les classer
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Eléphant du PHP | 179 Messages

06 oct. 2005, 10:46

Oui, je parlais juste de la fin de ma requête :) . C'était en rapport avec la requête écrite plus haut.
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Mammouth du PHP | 19672 Messages

06 oct. 2005, 11:28

Tu as répété ton alias dans le JOIN, essaye comme ça :

Code : Tout sélectionner

SELECT IdProduit, NomProduit, RefSociete, DisciplinesBases, TypeBases, TypeAcces, p.Presentation, TypeRecherche, Site, p.MAJ FROM produits p, societes s LEFT OUTER JOIN p ON s.IdSociete=p.RefSociete WHERE IdSociete='11' ORDER BY NomSociete
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 179 Messages

06 oct. 2005, 11:39

Ca ne change rien: l'erreur reste la même sous MyAdmin.
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

06 oct. 2005, 11:53

Code : Tout sélectionner

SELECT IdProduit, NomProduit, RefSociete, DisciplinesBases, TypeBases, TypeAcces, p.Presentation, TypeRecherche, Site, p.MAJ FROM produits AS p, societes AS s LEFT OUTER JOIN p ON s.IdSociete=p.RefSociete WHERE IdSociete='11' ORDER BY NomSociete

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

06 oct. 2005, 11:53

C'est quoi l'erreur ?
Le fait que tu utilises 2 fois l'alias 'p' ?
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.