2010-07-03 6 views
0

Я пытаюсь разрешить пользователям сортировать запросы mysql на основе имени, цены и т. Д. Этот выпадающий дает им возможность сделать это, он изменяет предложение «ORDER BY» на основе того, что пользователь выбирает. Это 3 утра здесь, и я просто не могу обнаружить ошибку:Что случилось с моим кодом?

<?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> 

позже на предложения ORDER BY используется так:

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

Не должен ли тег формы иметь значение для действия? Как и название текущей страницы ... Где POST? –

+2

Не обязательно, поскольку по умолчанию будет отображаться текущая страница. – spinon

ответ

4

Вы неправильно обрабатываете свое меню. Ваша переменная $ sortBy уже будет выбрана пользователем, а не полями $ _POST.

Это то, что вы должны сделать вместо этого -

<?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

На самом деле он не использует сортировку, за исключением обнаружения того, выбирают ли они выполнить пользовательский сортировку. После этого вы можете видеть, что он проверяет отдельные поля сообщения, чтобы узнать, какой из них используется. – spinon

+0

Приведенный выше код по умолчанию не будет использоваться, если параметры не выбраны, например, исходный код, который он опубликовал. Кроме того, что я опубликовал works =) –

+0

Извините, я думаю, что я ошибаюсь. Я делал предположение, что была другая область, которая была заполнена, именовала эти имена. Но я думаю, что ты на самом деле прав. – spinon

0

Кажется, что ваш код находится в двойных кавычках, когда оно должно быть в одном, чтобы PHP заменил ваш код. Вы должны распечатать этот sql на экране, и вы увидите, что он, скорее всего, не заменит значение.

Я имею в виду строку, в которой вы вызываете вызов mysql_query.

0

Ваш основной код немного неправильно. Он должен быть следующим: -

<?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> 

Я думаю, что это сработает сейчас, если вы измените код на вышеуказанный код.

Надеюсь, это поможет.

1

Я не могу прокомментировать ваш ответ Рафаэль, потому что я недостаточно высок, но я просто хочу упомянуть, возможно, используя оператор switch для удобочитаемости. Но вы там. Upvote

Смежные вопросы