2010-08-01 7 views
0

Je crée un formulaire de recherche personnalisé et lorsque j'essaie de trier les résultats, tous les objets sont affichés à la place des critères correspondants. La raison que j'ai découverte est que certaines des entrées du formulaire n'ont pas de valeur par défaut et quand cela n'est pas déclaré dans l'instruction conditionnelle plus tard (pour le tri), il affiche simplement tous les objets, que les autres conditions soient remplies ou ne pas. J'ai essayé d'appliquer une instruction OR avec les variables spécifiques pouvant être vides, mais cela a donné le même résultat. Comme si -PHP: instruction conditionnelle avec variables vides possibles

<?php if ($bedrooms >= $min_rooms 
      && $bedrooms <= $max_rooms 
      && $space >= $min_space 
      && $space <= $max_space 
      && $price >= $min_price 
      && $price <= $max_price 
      && $sel_type == $type 
      || $sel_type == '' 
      && $country == $sel_country 
      || $sel_country == '') { ?> 

(Voir les deux dernières déclarations) je pense à vérifier chaque variable dans l'instruction conditionnelle avant de l'inclure, mais il se sent comme code inutile. Comment le feriez-vous?

+0

ne vous avez pas une base de données? –

+0

Types de publications personnalisées. Je pense qu'il est plus facile d'envoyer les valeurs avec $ _POST à ​​la page de résultats. –

Répondre

3

L'opérateur && a une priorité plus élevée que l'opérateur ||, de sorte que votre expression est actuellement regroupée comme ça, probablement pas ce que vous voulez:

($bedrooms >= $min_rooms && $bedrooms <= $max_rooms && $space >= $min_space && $space <= $max_space && $price >= $min_price && $price <= $max_price && $sel_type == $type) 
|| 
($sel_type == '' && $country == $sel_country) 
|| 
($sel_country == '') 

Essayez d'ajouter entre parenthèses comme ceci pour obtenir le regroupement correct:

($bedrooms >= $min_rooms && $bedrooms <= $max_rooms && $space >= $min_space && $space <= $max_space && $price >= $min_price && $price <= $max_price && ($sel_type == $type || $sel_type == '') && ($country == $sel_country || $sel_country == '')) 
+0

Ah, merci! Pourquoi n'ai-je pas essayé ... –

1

Votre expression peut échouer car l'opérateur && a un precedence supérieur à l'opération ||. Cela signifie une expression comme ceci:

… && $sel_type == $type || $sel_type == '' 

est équivalent à cette (priorité de l'opérateur mis en évidence en utilisant des parenthèses):

(… && $sel_type == $type) || $sel_type == '' 

Pour corriger cela mettre les || expressions entre parenthèses:

$bedrooms >= $min_rooms && $bedrooms <= $max_rooms && $space >= $min_space && $space <= $max_space && $price >= $min_price && $price <= $max_price && ($sel_type == $type || $sel_type == '') && ($country == $sel_country || $sel_country == '') 

En outre, votre expression est probablement plus facile à lire et à maintenir si vous utilisez des fonctions auxiliaires telles qu'une fonction between:

function between($val, $min, $max) { 
    return $min <= $val && $val <= $max; 
} 

Ensuite, votre expression se lit comme suit:

between($bedrooms, $min_rooms, $max_rooms) && between($space, $min_space, $max_space) && between($price, $min_price, $max_price) && ($sel_type == $type || $sel_type == '') && ($country == $sel_country || $sel_country == '') 
+0

Bon conseil, merci! –

Questions connexes