Page 1 sur 3
Trier affichage requète selon une variable
Posté : 06 avr. 2008, 16:13
par Meyan
Bonjour,
je commence à me mettre au php et ai réalisé un petit script qui marche parfaitement mais sur lequel je bloque complètement juste à la fin pour afficher les résultats. Mon script permet de donner une valeur à une variable de façon à afficher cette variable ensuite pour chaque données correspondant à ma requète SQL :
- requète SQL
- boucle
- opération permettant de calculer la variable $res
- affichage des résultats de la requète en incorporant $res à chaque fois
Tout ca marche parfaitement, seulement je voudrais trier l'affichage à la fin par ordre décroissant de $res. Et ca, je ne sais absolument pas comment faire !
Voici mon script, ca vous permettra sans doute de mieux comprendre ($prix est défini auparavant dans un formulaire) :
$sql = "SELECT * FROM calcul WHERE min <= $prix AND max >= $prix AND Logiciel LIKE '$logiciel%'";
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
$num_rows = mysql_num_rows($req);
if($num_rows == 0)
{
echo "<b><center>Désolé, il n'y a aucune réponse pour cette somme.</center></b>";
}
else
while($data = mysql_fetch_assoc($req))
{
if($data['montant'] < $prix)
{
$res = $data['montant'];
}
else
$res = ($data['coef'] * $prix);
if($data['montant'] < $res)
{
$res = $data['montant'];
}
echo '- sur <b><a href='.$data['lien_page'].' class="tit3">'.$data['titre'].'</a></b> Celui-ci coute '.$res.'.br>';
echo ''.$data['comments'].'<br><br>';
}
J'ai essayé un "ORDER BY $res" sur la requète mais bien sur ca ne fonctionne pas car $res n'est pas encore défini à ce moment du script. J'ai tenté ensuite de faire une seconde requète qui serait triée avec $res mais je n'obtiens que des messages d'erreur.
J'ai beau chercher sur le net je n'ai vu aucune info là dessus. Comment faire pour trier l'affichage des résultats d'une requète enfonction d'une variable ?
[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]
Posté : 06 avr. 2008, 16:47
par ouckileou
ça correspond à quoi $res ?
J'ai beau chercher sur le net je n'ai vu aucune info là dessus. Comment faire pour trier l'affichage des résultats d'une requète enfonction d'une variable ?
Ben de la même façon que tu fais ton select avec $prix...

Posté : 06 avr. 2008, 17:01
par Meyan
Je ne peux pas faire un ORDER BY sur la requete avec $res car la variable $res est justement calculée à la suite de cette requète. Elle n'est donc pas encore définie au moment de la requète.
Mes visiteurs rentrent un prix dans un formulaire. A partir de ce prix je sélectionne dans ma bdd tous les éléments qui correspondent à ce prix, puis ensuite je calcule $res pour chacun des élements correspondants.
Ensuite j'affiche chaque élément de la requète avec en plus pour chacun d'eux le résultat de $res.
Tout ca marche parfaitement, je voudrais juste pouvoir ordonner l'affichage en fonction de $res mais toutes mes tentatives ont échouées.
[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]
Posté : 06 avr. 2008, 17:04
par ouckileou
Je réitère ma question : à quoi correspond $res ?
Posté : 06 avr. 2008, 17:29
par Meyan
$res correspond à la remise qu'ils peuvent espérer sur tel ou tel produit renvoyé par la requète.
Ils rentrent un prix correspondant à leur budget, la requète renvoie tous les articles correspondant à ce prix, et ensuite je calcule la remise ($res) pour chacun des articles. Je dois faire comme ca car $res dépend du prix de départ.
Donc une fois la requète effectuée, en fonction des données renvoyées je calcule $res :
Code : Tout sélectionner
if($data['montant'] < $prix)
{
$res = $data['montant'];
}
else
$res = ($data['coef'] * $prix);
if($data['montant'] < $res)
{
$res = $data['montant'];
Voilà c'est tout. Mais peu importe, ca change rien pour trier les résultats.
[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]
Posté : 06 avr. 2008, 17:44
par ouckileou
Bah si ça change que pour t'aider à régler ton problème c'est bien de savoir de quoi on parle...
Donc soit ta remise tu la calcules dans ta requête, en SQL, et tu peux trier dessus.
Soit tu fais comme pour $prix, c'est à dire que tu affiches les résultats, et tu proposes à l'utilisateur de resoumettre le formulaire pour trier.
Soit tustockes tes résultats dans un tableau et tu tries ce tableau avant de l'afficher.
Posté : 06 avr. 2008, 17:55
par Meyan
Ok merci pour tes pistes.
Apparemment la solution 1 n'est pas possible dans mon cas vu que la variable est calculée après (si j'ai bien compris ce que tu veux dire).
Pour la seconde ca m'embète que le visiteur doive choisir l'option de tri, je préfèrerais que le tri se fasse dès l'affichage.
La troisième solution me semble la plus adaptée à ce que je veux.
C'est marrant qu'on soit obligé de faire ca, je pensais qu'une fonction de php permettrait de le faire "simplement" vu que c'est quelque chose qu'on peut avoir besoin de faire assez couramment.
Je vais essayer de mettre ca en tableau et de le trier tout de suite ! Merci
[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]
Posté : 06 avr. 2008, 18:18
par ouckileou
Pour l'instant tu la calcules après, mais tu peux faire des calculs en SQL, tu as des IF, des fonctions mathématiques, tu peux regarder un peu la manuel pour voir si ça te conviendrait. Tu récupèrerais ainsi tes données déjà triées. A tester.
Posté : 06 avr. 2008, 18:36
par Meyan
Ha bon, ca serait possible de calculer la variable $res avant ma requète ?
Alors là ca dépasse complètement mes (pauvres) connaissances. Etant donné que le calcul de $res est basé sur les résultats de la requète, je ne sais pas du tout comment la calculer avant. Mais bon si le tri par tableau fonctionne je vais laisser le script comme ca et ca m'ira très bien.
En revanche, juste pour mieux comprendre vu que je fais ca surtout pour apprendre : sais tu pourquoi il ne faut pas de parenthèses à cet endroit là :
Normalement après un if on met toujours l'action entre parenthèses mais ici ca ne fonctionne pas si j'en mets. Je comprends pas vraiment pourquoi.
De la même façon, j'ai vu que dans ma requète je pouvais utiliser BETWEEN ... AND ... pour la variable $prix mais je ne sais pas si c'est mieux que <$ prix AND >$prix... C'est pas très important de toute facon, c'est surtout pour rendre le code plus propre possible.
[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]
Posté : 06 avr. 2008, 19:02
par ouckileou
Non après un if() on met l'action entre accolades.
Pour le BETWEEN, je trouve ça effectivement plus propre, plus lisible. Maintenant si c'est mieux je ne sais pas, niveau perfs peut-être et encore ça doit pas changer grand chose à petite échelle si c'est le cas. Teste

Posté : 06 avr. 2008, 19:36
par Meyan
Ha oui effectivement avec des accolades ca fonctionne ! J'avais pas remarqué su'il s'agissait d'accolades et non de parenthèses
En revanche bizarrement si je mets pas d'accolades après ce else ca marche quand même aussi...
[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]
Posté : 06 avr. 2008, 19:43
par ouckileou
En revanche bizarrement si je mets pas d'accolades après ce else ca marche quand même aussi...
Oui parceque tu n'as qu'une instruction, si tu voulais en mettre plusieurs il te faudrait des accolades, d'ailleur sje te conseille d'en mettre systématiquement. Enfin encore une fois c'est personnel, c'est pour la lisibilité.
Je t'invite aussi à aller voir le manuel dès que tu ne comprends pas qqchose, les réponses y sont, exemple :
http://php.net/if
Posté : 06 avr. 2008, 20:25
par Meyan
ok d'accord, c'est juste pour ca !
Je suis déjà allé voir plusieurs fois le manuel ainsi qu'un grand nombre d'autres sites sur le php mais on a vite fait de s'y paumer quand on apprend avec toutes ces informations.
Merci pour tes explications, je vais essayer de continuer mon truc en peaufinant les controles maintenant.
[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]
Posté : 07 avr. 2008, 00:52
par Meyan
Bon ca marche pas du tout...
4h que j'essaie simplement de trier mes résultats par ordre croissant en fonction de la variable $res et impossible ! J'ai testé des tas de trucs en m'inspirant d'exemples ou de tutoriaux sur internet, j'ai essayé plein d'"array" différents, j'ai essayé plein de "foreach" différents (au mieux ca les met l'un en dessous de l'autre au lieu de les aligner), j'ai essayé de mettre des <hr><td> avant la boucle while et d'afficher ces tables ensuite avec le contenu de la boucle mais du coup je peux pas trier...
Je ssuis complètement bloqué, ras le bol de ce truc.
[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]
Posté : 07 avr. 2008, 00:57
par Meyan
De toute façon maintenant que je vois mieux ce que ca ferait je suis pas sur que les tableaux seraient le plus adapté.
Ce que je voudrais c'est qu'à la fin de la requète il affiche quelque chose comme :
- avec tel article1 votre remise sera de 102 euros
- avec tel article2 votre remise sera de 98 euros
- avec tel article3 votre remise sera de 25 euros
mais par ordre décroissant en fonction de la remise (qui correspond à $res)...
Et pas
- tel article1 102 euros
- tel article2 98 euros
- tel article3 25 euros
[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]