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

Eléphant du PHP | 179 Messages

06 oct. 2005, 11:59

Je ne sais pas parce que j'ai déjà utilisé ce type de jonctions dans d'autres scripts et elles fonctionnent parfaitement. Je ne comprends plus rien. :(
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Eléphant du PHP | 179 Messages

07 oct. 2005, 10:27

Bonjour à tous,
Je me permets de relancer le topic car je n'arrive toujours pas à résoudre mon problème. Quelqu'un aurait-il une idée?
Merci pour votre aide.
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

07 oct. 2005, 10:54

Je ne suis pas certaine d'avoir le temps de t'aider, mais : fais nous un point clair de la situation.
Où en es-tu ?
Quel est ton souci ? Qu'as-tu déjà essayé ?
Quel est ton code actuel ? Quelle sortie as-tu quand tu affiches tes variables ?

Eléphant du PHP | 179 Messages

07 oct. 2005, 11:32

1. Ce que je voudrais voir afficher:

J'ai une société qui comprend plusieurs produits. Je voudrais que tous les produits d'une société s'affichent et que je puisse accéder à chacune des fiches "produits" à partir de la fiche "société".

L'affichage se fait comme suit:

Script A: Sélection de la société par l'intermédiaire d'une liste déroulante à choix unique.

Script B: Affichage de la fiche de la société dans laquelle sont stipulés les produits qu'elle fabrique. Ces produits sont chacun cliquables individuellement et renvoient à leur fiche respective.

2. Les problèmes que je rencontre.

A chaque fois que j'enregistre plusieurs produits pour une même société, je n'ai pas de problème dans ma base: tout s'enregistre correctement.
En revanche, dans la liste déroulante de mon script A une nouvelle ligne apparaît. Par exemple, une société "BARBAPAPA" fabrique un produit "BONBON". Si je veux enregistrer un produit "SUCETTE", une nouvelle ligne apparaît dans ma liste déroulante et ainsi j'ai deux lignes "BARBAPAPA".

Second problème: les deux lignes du script A renvoient à deux fiches exactement identiques et c'est le dernier produit enregistré qui apparaît. Par exemple, j'ai deux fiches sociétés "BARBAPAPA" dans laquelle seul apparaît le produit "SUCETTE".

3. Les modifications de mon script:

Après différentes tentatives infructueuses, la partie relative à l'affichage des produits de mon script B ressemble à ça: mais c'est encore pire que tout le reste. Plus rien ne s'affiche.
<td>
<?php

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

//Requête de sélection des produits qui correspondent au paramètre "société d'appartenance"//
	$requete3="SELECT IdProduit, NomProduit
	        FROM produits p
	        INNER JOIN societes s ON s.IdSociete=p.RefSociete
        	ORDER BY NomProduit";
	$result3=mysql_query($requete3);

//Tant qu'il y a des produits, on les affiche//

if (mysql_num_rows($result3))
{
	while ($val=mysql_fetch_array($result3))

?>


<a href="aff_produits.php?IdProduit=<?php print ($val["IdProduit"]);?>"><?php print ($val["NomProduit"]);?></a>
	</td>
</tr>

<?php

}
mysql_close($lien);
?>
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Mammouth du PHP | 19672 Messages

07 oct. 2005, 11:56

Je ne comprends pas comment tu identifies une société en particulier dans ce code. Si à partir d'une liste de société tu dois accéder à ce script en sélectionant une société, tu dois récupérer l'identifiant de cette société, de la même manière qu'ici, tu récupères l'identifiant du produit dans la fiche produit grâce au paramètres que tu ajoutes dans la boucle while. Si tu sélectionnes la société de la même manière, l'url vers la page "société devait donc avoir un paramètre que je nommerai ici "idsoc" : ce bout de code pour la page société devrait donc ressembler à ceci:
<?php
// On récupère l'identifiant de la société :
$idSociete = $_GET['idsoc'];
//connection à la base et sélection de la table et des champs//
$lien = mysql_connect("xx","xx","xx");
mysql_select_db("xx", $lien);

//Requête de sélection des produits qui correspondent au paramètre "société d'appartenance"//
$requete3="SELECT IdProduit, NomProduit
            FROM produits p
            WHERE RefSociete = ". $idSociete ."
            ORDER BY NomProduit";
$result3=mysql_query($requete3);

//Tant qu'il y a des produits, on les affiche//

if (mysql_num_rows($result3))
{
    while ($val=mysql_fetch_array($result3))
    {
?>
<tr>
    <td>
        <a href="aff_produits.php?IdProduit=<?php print ($val["IdProduit"]);?>"><?php print ($val["NomProduit"]);?></a>
    </td>
</tr>
<?php
    }
}
mysql_close($lien);
?>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 179 Messages

07 oct. 2005, 12:38

\:D/ Ca y'est, j'ai trouvé. Cyrano, tu m'a mise sur la voie. La solution était sous mes yeux puisque j'avais déjà fait quelque chose de similaire pour le groupe (cf. le premier message). Seulement, je pensais que ça ne pouvait afficher qu'un seul groupe (ce qui est logique en soi puisqu'une société ne peut avoir qu'un seul groupe :roll: ).
En tous cas, je vous remercie tous pour votre aide. :agenouille: :agenouille:

Voici la partie de script qui fonctionne correctement.

<td>

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

//Affichage du nom des produits//
$requete3=" SELECT *
		FROM produits";//Pas d'inquiétude pour les puristes, je vais remplir tous les champs.
$result3=mysql_query($requete3);
while ($val3=mysql_fetch_array($result3))
	{
	if ($val3["RefSociete"] == $IdSociete)
	{
		print ('');
?>

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

Mammouth du PHP | 19672 Messages

07 oct. 2005, 12:45

C'est drôlement plus lourd ton système, il faudrait limiter le retour de MySQL en ajoutant une clause WHERE identifiant la société, et tu supprimeras le if() dans l'affichage puisque ça ne retournera QUE les produits de cette société.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

07 oct. 2005, 14:55

Logiquement je comprends ce que tu veux dire. Pratiquement, je ne vois pas du tout comment faire. :-s

Mammouth du PHP | 19672 Messages

07 oct. 2005, 15:52

Regarde le code que j'ai mis juste avant le tiens
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

07 oct. 2005, 15:58

Oui j'ai tenté de l'appliquer mais ça ne fonctionnait pas alors j'ai tenté ce code. Il ne reconnaissait pas $IdSociete.

Mammouth du PHP | 19672 Messages

07 oct. 2005, 16:13

:shock: Alors comment il peut le reconnaitre dans ta version ???
//...
 if ($val3["RefSociete"] == $IdSociete) 
//...
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 179 Messages

11 oct. 2005, 10:19

:lol: Je ne sais pas. Parfois ça me donne des résultats étranges. Souvent une requête qui devrait fonctionner ne marche pas jusqu'à ce que je réinitialise totalement Easy PHP et que j'ai fermé tous les autres programmes. Ca m'est arrivé sur deux postes différents après que j'ai modifié plusieurs fois et longtemps un script.
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!