2010-07-03 142 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

不应该表单标签有一个值的行动?像当前页面的名称一样...发布到哪里? – 2010-07-03 06:13:49

+2

不一定,因为默认值是当前页面。 – spinon 2010-07-03 06:14:14

回答

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 2010-07-03 06:16:09

+0

如果没有选择选项,上面的代码将默认不使用,就像他发布的原始代码一样。除了我发布的作品=) – 2010-07-03 06:19:41

+0

对不起,我猜我错了。我假设有另一个字段正在填充名称。但我认为你其实是对的。 – spinon 2010-07-03 06:19:56

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