2010-07-03 5 views
0

J'essaie de permettre aux utilisateurs de trier les requêtes mysql en fonction du nom, du prix, etc. Ce menu déroulant leur donne le pouvoir de le faire, il modifie la clause "ORDER BY" en fonction de ce que l'utilisateur choisit. Il est trois heures ici et je ne peux pas repérer l'erreur:Quel est le problème avec mon code?

<?php 
     $sortBy = $_POST['sortBy']; 
     if ($sortBy) { 

      $priceLowToHigh = $_POST['price-low-to-high']; 
      $priceHighToLow = $_POST['price-high-to-low']; 
      $dateMostRecent = $_POST['date-most-recent']; 
      $dateOldest = $_POST['date-oldest']; 
      $alphabeticalOrder = $_POST['alphabetical-order']; 

      if ($priceLowToHigh) { 
       $sortOrder = "price ASC"; 
      } elseif ($priceHighToLow) { 
       $sortOrder = "price DESC"; 
      } elseif ($dateMostRecent) { 
       $sortOrder = "date DESC"; 
      } elseif ($dateOldest) { 
       $sortOrder = "date ASC"; 
      } elseif ($alphabeticalOrder) { 
       $sortOrder = "name ASC"; 
      } 

     } else { 
      $sortOrder = "date DESC"; 
     } 
    ?> 
    <form action="" method="post"> 
     <select name="sortBy" onchange="this.form.submit()"> 
      <option>Sort By</option> 
      <option value="price-low-to-high">Price (low to high)</option> 
      <option value="price-high-to-low">Price (high to low)</option> 
      <option value="date-most-recent">Date (most recent)</option> 
      <option value="date-oldest">Date (oldest)</option> 
      <option value="alphabetical-order">Alphabetical Order</option> 
     </select> 
    </form> 

plus tard la clause ORDER BY est utilisée comme ceci:

$query = mysql_query("SELECT * FROM products WHERE category = $categoryId ORDER BY $sortOrder"); 
+0

L'étiquette de formulaire ne doit-elle pas avoir une valeur pour l'action? Comme le nom de la page actuelle ... Où POSTER? –

+2

Pas nécessairement par défaut sera la page en cours. – spinon

Répondre

4

Vous ne traitez pas correctement votre menu. Votre variable $ sortBy sera déjà ce que l'utilisateur sélectionne, pas les champs $ _POST séparés.

C'est ce que vous devez faire à la place -

<?php 
    $sortBy = $_POST['sortBy']; 
    if($sortBy == 'price-low-to-high') { 
     $sortOrder = "price ASC"; 
    } else if($sortBy == 'price-high-to-low') { 
     $sortOrder = "price DESC"; 
    } else if($sortBy == 'date-most-recent') { 
     $sortOrder = "date DESC"; 
    } else if($sortBy == 'date-oldest') { 
     $sortOrder = "date ASC"; 
    } else if($sortBy == 'alphabetical-order') { 
     $sortOrder = "name ASC"; 
    } else { 
     $sortOrder = "date DESC"; 
    } 
?> 
+0

En fait, il n'utilise pas tri sauf pour détecter s'ils choisissent d'effectuer un tri personnalisé. Vous pouvez voir après cela qu'il vérifie les champs de poste individuels pour voir lequel est utilisé. – spinon

+0

Le code ci-dessus ne sera pas utilisé par défaut si les options ne sont pas sélectionnées, comme le code original qu'il a posté. Sauf celui que j'ai posté fonctionne =) –

+0

Désolé je suppose que je me trompe. Je faisais l'hypothèse qu'il y avait un autre champ qui se peuplait appelé ces noms. Mais je pense que vous avez raison. – spinon

0

Il semble que votre code est entre guillemets quand il devrait être en single pour avoir php faire le remplacement de votre code. Vous devriez imprimer ce sql à l'écran et vous verrez qu'il ne remplacera probablement pas la valeur. Je veux parler de la ligne où vous faites l'appel mysql_query.

0

Votre code de base est un peu mal. Ce devrait être le suivant: -

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

if($sortBy == 'price-low-to-high') 
    $sortOrder = "price ASC"; 
else if($sortBy == 'price-high-to-low') 
    $sortOrder = "price DESC"; 
else if($sortBy == 'date-most-recent') 
    $sortOrder = "date DESC"; 
else if($sortBy == 'date-oldest') 
    $sortOrder = "date ASC"; 
else if($sortBy == 'alphabetical-order') 
    $sortOrder = "name ASC"; 
else 
    $sortOrder = "date DESC"; 
?> 

<form action="" method="post"> 
     <select name="sortBy" onchange="this.form.submit()"> 
      <option>Sort By</option> 
      <option value="price-low-to-high">Price (low to high)</option> 
      <option value="price-high-to-low">Price (high to low)</option> 
      <option value="date-most-recent">Date (most recent)</option> 
      <option value="date-oldest">Date (oldest)</option> 
      <option value="alphabetical-order">Alphabetical Order</option> 
     </select> 
</form> 

Je pense que ceci fonctionnera maintenant, si vous changez votre code au code ci-dessus.

Espérons que ça aide.

1

Je ne peux pas commenter sur votre réponse Raphael parce que je ne suis pas assez élevé, mais je veux juste mentionner éventuellement en utilisant une déclaration de commutateur pour la lisibilité. Mais vous êtes sur place là-bas. Upvote