filtrer les resutats d'une requete via formulaire post

michael410
Invité n'ayant pas de compte PHPfrance

15 févr. 2011, 13:59

bonjour
je suis débutant en PHP et je viens de finir un morceau de code permettant de filtrer les resultats
d'une requete en fonction d'un formulaire post, tout semble enfin fonctionner correctement
mais pourriez vous me confirmer si le tout est correct?

partie PHP:

Code : Tout sélectionner

<? //pour eviter page expiree sous ie et message renvoyer info sous ff session_cache_limiter('private, must-revalidate'); //detruit filtre si on change de categorie unset($_SESSION['filtre']); //debut session session_start(); // variable pour trouvez la page du catalogue if($_GET["debut"] == ""){ $Debut = 0; }else{ $Debut = intval($_GET["debut"]); } // si on post un filtre on reinit le debut a la page1 if($_POST["taille"] != ""){ $Debut = 0; }else{ $Debut = intval($_GET["debut"]); } //si post effectué la requete est modfie en fonction //puis sauvegarde dans fichier de session //pour conserver le filtre en page 2 du catalogue if (isset($_POST["taille"])){ $secuTaille=intval($_POST["taille"]); $_SESSION['filtre']=$secuTaille; } else { if (isset($_SESSION['filtre'])) $secuTaille=$_SESSION['filtre']; } //debut requete a modifier par filtre $requete = "SELECT DISTINCT ..."; //test sur champ du catalogue pour verifier si on applique le filtre if($rowRub["FitreActif"] == "1"){ //decoupe des requete et modif des requete en fonction du post switch ($secuTaille){ case 0 : //0 correspond a indifferent donc requete classqiue $resultProduitsTmp = "$requete"; $resultProduitsTmp .= " ORDER BY Ordre LIMIT " . $Debut . ""; $resultProduits = mysql_query("$resultProduitsTmp, 19",$db); break; case 50 : $resultProduitsTmp = "$requete"; //ajout de la condition du filtre $resultProduitsTmp .= " AND ((table2.nom >= 49 AND table2.nom <=51) OR (table.nom >= 49 AND table.nom <=51))"; $resultProduitsTmp .= " ORDER BY Ordre LIMIT " . $Debut . ""; $resultProduits = mysql_query("$resultProduitsTmp, 19",$db); break; case 52 : ... break; } }else{ //si param filtre absent requete classique $resultatPro = mysql_query("..."); } ?>
Partie formulaire dans la page:

Code : Tout sélectionner

//test sur champ du catalogue pour verifier si on applique le filtre <? if($rowRubrique["FitreActif"] == "1"){ ?> <form method="post" style="display:inline; height:0px;"> <table width="201" border="0" cellspacing="0" cellpadding="0"><tr> <td width="104">Filter par Taille:</td><td width="97"> <select name="taille" class="Taille9" id="taille" style="width:75px;" onchange="submit(); return false;"> //force selection si POST ou SESSION actif <option value="0" <? if(($_POST["taille"] == "0") OR ($_SESSION["filtre"] == "0")){ ?> selected="selected" <? } ?>>Indifferent</option> <option value="50" <? if(($_POST["taille"] == "50") OR ($_SESSION["filtre"] == "50")){ ?> selected="selected" <? } ?>>49 à 51</option> <option value="52" <? if(($_POST["taille"] == "52") OR ($_SESSION["filtre"] == "52")){ ?> selected="selected" <? } ?>>51 à 53</option> ... </select> </td></tr></table></form> <? } ?>

Eléphant du PHP | 99 Messages

15 févr. 2011, 18:28

Essai de prendre l'habitude d'utiliser la base <?php et non <?, en outre, le session_start(); doit toujours se trouver en haut de ta page ;).

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

15 févr. 2011, 23:17

Effectivement, il vaut mieux utiliser <?php pour éviter des problèmes de compatibilité avec les serveurs et les versions de php. Concernant le session_start() le fait de le mettre au début permet effectivement de ne pas l'oublier, mais ça n'a rien d'une règle. Ce pourrait être l'avant dernière ligne du script, du moment que rien n'est envoyé au navigateur et que l'on a pas besoin des sessions avant, ça n'y changerait rien :)

Sinon en vrac :

Concernant ce code, le commentaire n'est pas bon :
//detruit filtre si on change de categorie
unset($_SESSION['filtre']);
Ce code "detruit le filtre" que tu as en session, point. Du coup quand un peu plus loin tu veux récupérer la valeur en session comme valeur par défaut :
if (isset($_SESSION['filtre']))
     $secuTaille=$_SESSION['filtre']; 
ton test retournera toujours FAUX

Ceci peut également être simplifié :
// variable pour trouvez la page du catalogue
if($_GET["debut"] == ""){
   $Debut = 0;
}else{
   $Debut = intval($_GET["debut"]);
}

// si on post un filtre on reinit le debut a la page1
if($_POST["taille"] != ""){
   $Debut = 0;
}else{
   $Debut = intval($_GET["debut"]);
}
en
// variable pour trouvez la page du catalogue OU si on post un filtre on reinit le debut a la page1
if($_GET["debut"] == "" || $_POST["taille"] != ""){
   $Debut = 0;
}else{
   $Debut = intval($_GET["debut"]);
}
Enfin, quelques petites remarques complémentaires pour alléger ton code et le rendre plus lisible :
- concatener une chaine vide à une autre chaine ne sert pas à grand chose :
$resultProduitsTmp .= " ORDER BY Ordre LIMIT " . $Debut . "";
Tu obtiendras le même résultat avec ceci et ton code n'en sera que plus lisible :)
$resultProduitsTmp .= " ORDER BY Ordre LIMIT " . $Debut;
- demander à php de parcourir une chaine pour vérifier si celle-ci contient une variable et retourner la valeur de cette variable me semble moins optimiser que de récupérer directement la valeur de la variable :
$resultProduitsTmp = "$requete";
Ceci marchera tout aussi bien, et même si cela se compte en pouillemes, cela consommera également moins de ressources
$resultProduitsTmp = $requete;
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

michael410
Invité n'ayant pas de compte PHPfrance

16 févr. 2011, 13:18

un grand merci à ryle, je vais étudier tout ca de plus près