Bonnes ou mauvaises conditions?

Eléphant du PHP | 179 Messages

02 août 2005, 10:41

Bonjour à tous.

Voici ma démarche:
1. Je choisis une discipline dans une liste déroulante à choix unique.
2. J'affiche en fonction de la discipline choisie les produits associés à cette discipline.

Mon problème: J'affiche tout !

Je pense que je fais une erreur logique dans mes conditions. Pourriez vous m'aider?
<?php
$DisciplinesBases = $_POST['DisciplinesBases'];

	$lien = mysql_connect("xx","xx","xx");
	mysql_select_db("xx", $lien);
	$requete="SELECT NomProduit, DisciplinesBases FROM produits ORDER BY DisciplinesBases";
	$result=mysql_query($requete);
while ($val=mysql_fetch_array($result))
{
if ($DisciplinesBases == "Chimie")
	{
?>

<table class="tableau">
<table rules="cols" border=0 cellspacing=0 cellpadding=5>

<!-- titres-->

<tr bgcolor="e0e0ff">

<td><b>Produit</b></td>
<td><b>Disciplines des bases</b></td>
</tr>

<tr bgcolor="#ffffe0">	

<td> <? print ($val["NomProduit"]);?> </td>
<td> <? print ($val["DisciplinesBases"]);?> </td>
</tr>

</table>

<?
	}
elseif ($DisciplinesBases == "Economie et gestion")
	{
?>

<table class="tableau">
<table rules="cols" border=0 cellspacing=0 cellpadding=5>

<!-- titres-->

<tr bgcolor="e0e0ff">

<td><b>Produit</b></td>
<td><b>Disciplines des bases</b></td>
</tr>

<tr bgcolor="#ffffe0">	

<td> <? print ($val["NomProduit"]);?> </td>
<td> <? print ($val["DisciplinesBases"]);?> </td>
</tr>

</table>

[...]

<?
	}
else
	{
print("Il n'y a pas de résultat");
	}
}
mysql_close($lien);
?>


Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

02 août 2005, 10:46

utilise plutôt une condition WHERE dans ta requête SQL, pour ne sélectionner que les disciplines demandées :)

ici tu les sélectionnes toutes et tu fais :
SI discipline = chimie ALORS je les affiche
SINON SI discipline = économie ALORS je les affiche

forcément ça affiche tout ;)

Eléphant du PHP | 179 Messages

02 août 2005, 10:56

utilise plutôt une condition WHERE dans ta requête SQL, pour ne sélectionner que les disciplines demandées :)

ici tu les sélectionnes toutes et tu fais :
SI discipline = chimie ALORS je les affiche
SINON SI discipline = économie ALORS je les affiche

forcément ça affiche tout ;)

Est-ce que je dois faire tout sur des pages différentes pour avoir:

SI discipline = chimie ALORS j'affiche les produits associés à la chimie
SINON j'affiche "pas de résultat"

SI discipline = economie ALORS j'affiche les produits associés à l'économie ?


Dans ce cas je suppose que j'aurais qq chose du type:
$requete="SELECT NomProduit, DisciplinesBases FROM produits WHERE DisciplinesBases='Chimie' ";

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

02 août 2005, 10:59

Est-ce que je dois faire tout sur des pages différentes pour avoir:

SI discipline = chimie ALORS j'affiche les produits associés à la chimie
SINON j'affiche "pas de résultat"

SI discipline = economie ALORS j'affiche les produits associés à l'économie ?
non et heureusement, c'est tout l'intérêt du PHP :)

tu récupères une discipline grâce à ta liste déroulante, utilise la non plus pour une condition d'affichage, mais pour une condition de sélection

- récupère la valeur de la liste (vérifie qu'elle a bien été transmise, une valeur par défaut au départ)
- intègre la dans ta requête
- exécute la requête
- affiche tes données

ta requête est donc a priori bonne, mais la valeur du critère de sélection changera dynamiquement :
$requete="SELECT NomProduit, DisciplinesBases FROM produits WHERE DisciplinesBases='".$DisciplinesBases."'";
Voici un test à placer en début de page. Il attribue une valeur par défaut (Chimie), lorsque tu arrives pour la première fois sur la page et que tu n'as donc aucun paramètre de transmis (si c'est nécessaire, à voir suivant le fonctionnement de ta page)
$DisciplinesBases = (isset($_POST['DisciplinesBases']))?$_POST['DisciplinesBases']:'Chimie';
en français :
SI $_POST['DisciplinesBases'] existe ALORS je stocke sa valeur dans la variable
SINON je met dans la variable 'Chimie'

Eléphant du PHP | 179 Messages

02 août 2005, 11:26

<?php
$DisciplinesBases = $_POST['DisciplinesBases'];

	$lien = mysql_connect("xx","xx","xx");
	mysql_select_db("xx", $lien);
	$requete="SELECT NomProduit, DisciplinesBases FROM produits WHERE DisciplinesBases= '".$DisciplinesBases."'";
	$result=mysql_query($requete);
while ($val=mysql_fetch_array($result))
{
if ($DisciplinesBases == "Chimie")
	{
?>

<table class="tableau">
<table rules="cols" border=0 cellspacing=0 cellpadding=5>

<!-- titres-->

<tr bgcolor="e0e0ff">

<td><b>Produit</b></td>
<td><b>Disciplines des bases</b></td>
</tr>

<tr bgcolor="#ffffe0">	

<td> <? print ($val["NomProduit"]);?> </td>
<td> <? print ($val["DisciplinesBases"]);?> </td>
</tr>

</table>

<?
	}
else
	{
print("Il n'y a pas de résultat");
	}
}
mysql_close($lien);
?>
Je ne vois pas comment je peux passer directement à ma sélection "Economie et gestion" sans avoir à ouvrir une autre page (quand j'essaie ça échoue). :oops:


P.S.: Par pure curiosité, pourquoi avoir fait une concaténation pour la requête?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

02 août 2005, 11:31

Je ne vois pas comment je peux passer directement à ma sélection "Economie et gestion" sans avoir à ouvrir une autre page (quand j'essaie ça échoue). :oops:
ta liste doit être dans un formulaire, tu dois recharger la page au changement de valeur.
Apparament ta liste déroulante est sur une autre page, l'idél serait peut-être de proposer la liste et les résultats sur la même page. L'utilisateur peut donc à tout moment choisir une valeur et afficher les résultats correspondants.

A toi de voir comment tu souhaites organiser tout ça :)
P.S.: Par pure curiosité, pourquoi avoir fait une concaténation pour la requête?
C'est plus propre et plus pratique :
- la variable se voit mieux
- si c'est une variable tableau, comme ici, cela évite des problèmes entre les guillemets qui entourent la chaine, ceux qui sont dans la chaine et ceux qui entourent l'index du tableau

Eléphant du PHP | 179 Messages

02 août 2005, 11:48

ta liste doit être dans un formulaire, tu dois recharger la page au changement de valeur.
Apparament ta liste déroulante est sur une autre page, l'idél serait peut-être de proposer la liste et les résultats sur la même page. L'utilisateur peut donc à tout moment choisir une valeur et afficher les résultats correspondants.

A toi de voir comment tu souhaites organiser tout ça :)
En fait la page où se trouve ma liste déroulante contient d'autres listes déroulantes (pour permettre une recherche par classification), d'où le tableau sur une nouvelle page.

Quand j'aurai réglé ce problème, je veux que les descriptifs des produits que j'aurai affichés apparaissent lorsque je clique dessus. C'est pourquoi j'ai besoin de passer par cette étape intermédiaire (le tableau qui propose des produits cliquables).

C'est pourquoi, pour une question de simplicité, je me demandais si c'était possible de mettre les différentes conditions sur la même page. J'ai essayé ceci mais ça ne fonctionne pas:
<?php
$DisciplinesBases = $_POST['DisciplinesBases'];

	$lien = mysql_connect("","","");
	mysql_select_db("", $lien);
	$requete="SELECT NomProduit, DisciplinesBases FROM produits WHERE DisciplinesBases= '".$DisciplinesBases."'";
	$result=mysql_query($requete);
while ($val=mysql_fetch_array($result))
{
if ($DisciplinesBases == "Chimie")
	{
?>

<table class="tableau">
<table rules="cols" border=0 cellspacing=0 cellpadding=5>

<!-- titres-->

<tr bgcolor="e0e0ff">

<td><b>Produit</b></td>
<td><b>Disciplines des bases</b></td>
</tr>

<tr bgcolor="#ffffe0">	

<td> <? print ($val["NomProduit"]);?> </td>
<td> <? print ($val["DisciplinesBases"]);?> </td>
</tr>

</table>

<?
	}
else
	{
print("Il n'y a pas de résultat");
	}
}
mysql_close($lien);
?>
<?
$DisciplinesBases = $_POST['DisciplinesBases'];

	$lien = mysql_connect("","","");
	mysql_select_db("", $lien);
	$requete2="SELECT NomProduit, DisciplinesBases FROM produits WHERE DisciplinesBases= '".$DisciplinesBases."'";
	$result2=mysql_query($requete2);
while ($val=mysql_fetch_array($result2))
{
if ($DisciplinesBases == "Economie et gestion")
	{
?>

<table class="tableau">
<table rules="cols" border=0 cellspacing=0 cellpadding=5>

<!-- titres-->

<tr bgcolor="e0e0ff">

<td><b>Produit</b></td>
<td><b>Disciplines des bases</b></td>
</tr>

<tr bgcolor="#ffffe0">	

<td> <? print ($val["NomProduit"]);?> </td>
<td> <? print ($val["DisciplinesBases"]);?> </td>
</tr>

</table>

	
<?	
	}
else
	{
print("Il n'y a pas de résultat");
	}
}
mysql_close($lien);
?>



Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

02 août 2005, 12:00

hum, c'est un peu tordu :)

ici tu fais une requête pour sélectionner la discpline voulue, puis tu affiches tout si c'est Chimie
puis la même requête, et tu affiches tout si c'est Economie

ça ne sert pas à grand chose ;)

je ne suis pas sûr de comprendre ce que tu veux :

1 - sur pageA, on choisit Chimie dans la liste et ça renvoit sur pageB qui affiche tous les articles de Chimie
2 - la pageB affiche tous les articles regroupés par catégorie
3 - c'est pas du tout ça et je réexplique #-o

Eléphant du PHP | 179 Messages

02 août 2005, 12:09

:lol: Moi pas pédagogue pour un sou? MEUH NON! :-"

Page A: menu déroulant. Je clique sur "Chimie".
Page B: tableau dynamique. Il affiche tous les produits (cliquables) dont la discipline est "Chimie".
Page C: fiche descriptive. J'ai cliqué sur le produit "Schmilblick" dont la discipline est la chimie.

Maintenant admettons que :
Page A: menu déroulant. Je clique sur "Economie et gestion".
Page B: tableau dynamique. Il affiche tous les produits (cliquables) dont la discipline est "Economie et gestion".
Page C: fiche descriptive. J'ai cliqué sur le produit "Blablabla" dont la discipline est l'économie et la gestion.

Concrètement, je n'arrive pas à exprimer le code de ma page B: je pense que mes conditions sont effectivement tordues. (Mais je crois que c'est tout l'art du débutant :wink: ).

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

02 août 2005, 12:15

je pense avoir compris, donc on est bien d'accord sur la page B tu n'afiches les produits que d'une catégorie à la fois ?

si c'est bien ça ([-o<), tu as le bon code dans ton message précédent, sauf qu'il est en double :)

page A : ici on a une liste déroulante avec toutes les disciplines, on va en choisir une et cela va nous renvoyer vers la page B

Code : Tout sélectionner

<form name="choisirDiscipline" method="POST" action="pageB.php"> <select" name="DisciplinesBases"> <option value="Chimie">Chimie</option> <option value="Economie et gestion">Economie et Gestion</option> </select> <br> <input type="submit" name="submit" value="Sélectionner">
pageB.php
<?php
// ici on récupère la valeur sélectionné dans le formulaire précédent
$DisciplinesBases = $_POST['DisciplinesBases'];

$lien = mysql_connect("","","");
mysql_select_db("", $lien);

// requête de sélection des produits qui correspondent au paramètre "discipline"
// ici si on a choisi Chimie, on ne récupèreras que les lignes correspondants à 'Chimie'
$requete="SELECT NomProduit, DisciplinesBases FROM produits WHERE DisciplinesBases= '".$DisciplinesBases."'";
$result=mysql_query($requete);

// tant qu'il y a des produits à afficher, on les affiche
while ($val=mysql_fetch_array($result))
{
	?>

	<table class="tableau">
	<table rules="cols" border=0 cellspacing=0 cellpadding=5>
	
	<!-- titres-->
	
	<tr bgcolor="e0e0ff">
	
	<td><b>Produit</b></td>
	<td><b>Disciplines des bases</b></td>
	</tr>
	
	<tr bgcolor="#ffffe0">    
	
	<td> <? print ($val["NomProduit"]);?> </td> // ---> ici un lien qui renvoie vers la page C, détail du produit
	<td> <? print ($val["DisciplinesBases"]);?> </td>
	</tr>

	</table>
	
	<?
}
mysql_close($lien);
?>
édition : j'ai enlevé le "if" qui ne sert à rien vu qu'on ne récupère les données QUE de 'Chimie' (ou autre) à la fois
Modifié en dernier par ouckileou le 02 août 2005, 12:29, modifié 1 fois.

Eléphant du PHP | 179 Messages

02 août 2005, 12:24

je pense avoir compris, donc on est bien d'accord sur la page B tu n'afiches les produits que d'une catégorie à la fois ?
C'est tout à fait ça.
si c'est bien ça (Pray), tu as le bon code dans ton message précédent, sauf qu'il est en double Smile
Oui mais il s'agit du code pour la discipline "Chimie". Si je veux le code pour la discipline "Economie et gestion", dois-je:
1. Créer une page spécifique?
2. Ou bien je peux l'intégrer dans le même script? Si c'est le cas, comment?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

02 août 2005, 12:28

Oui mais il s'agit du code pour la discipline "Chimie". Si je veux le code pour la discipline "Economie et gestion", dois-je:
NON : c'est le code pour toutes tes disciplines, même celle qui n'existe pas encore.
Puisque la discipline choisie et à afficher est dans une variable, qui provient de la liste déroulante, et qu'on insert dans la requête.

C'est TOUT le principe du PHP et des pages dynamiques en général : tu as 1 modèle de page, qui va être remplis suivant les conditions que tu donnes. D'où le dynamique : ta liste de produit dépendra du paramètre "discipline".
Au contraire du modèle statique : 1 page pour chaque discipline.
1. Créer une page spécifique?
Non, expliqué au dessus :)
2. Ou bien je peux l'intégrer dans le même script? Si c'est le cas, comment?
c'est déjà fait, j'édite mon message et je commente un peu mieux le code pour que tu comprennes ;)

Eléphant du PHP | 179 Messages

02 août 2005, 13:15

Ca y est, j'ai saisi mon erreur! \:D/ J'ai voulu spécifier mes champs plutôt que de réfléchir en globalité. C'est finalement une requête et pas des conditions qu'il me fallait.

Merci beaucoup pour cette aide précieuse (et pour cette grande mais grande patience). :D

Ah, une dernière petite chose pour la route: dans le cas où il n'y a pas de résultat et si je veux l'indiquer, comment je fais?

Mammouth du PHP | 543 Messages

02 août 2005, 14:01

Tu teste avec un mysql_num_rows avant de faire le while.
if (mysql_num_rows($result)>0) {
  while($val=mysql_fetch_array(....
  

} else {
  echo "Pas de résultat";
}
++

Invité
Invité n'ayant pas de compte PHPfrance

02 août 2005, 14:49

Manifestement ça ne lui plaît pas : il m'indique un "parse error" au niveau du "else" :(

Merci pour la fonction malgré tout. J'ai essayé d'autres possibilités mais elles ne fonctionnent pas non plus. J'avoue humblement que je ne connaissais pas celle-ci.