我有一个产品页面,显示了我网站上出售的所有产品,旁边有链接,允许用户缩小搜索范围,例如按颜色搜索。因此,如果他们点击"红色"链接,只会显示红色的产品。设置了数据库表,以便每种颜色都有"yes"或"no"的值,因此当单击链接时,查询看起来像这样:
if(isset($_GET['color'])) {
$color = filter($_GET['color']);
$query = mysql_query("SELECT * FROM products WHERE $color='yes'") or die (mysql_error());
}
然后,我有一个while循环显示产品:
<?php
while ($result = mysql_fetch_array($query)) {
...Display product info here...
}
?>
我遇到麻烦的部分是排序结果后,他们返回。页面上还有额外的链接,可以按"Price"answers"latest"对返回的结果进行排序。我在如何使用这些排序链接的逻辑上遇到了麻烦。
例如,当我点击"红色"链接后,我只能看到红色的产品。现在我想能够点击"价格"链接,应该按价格排序只有红色的产品。我不知道我是否可以在结果返回后对它们进行排序,或者我是否可以使用附加条件(ORDER BY price)重新查询数据库。如果第二种情况是正确的方法,那么如何将条件附加到前一个查询并重新查询DB?有人能帮我一下吗?我已经研究了几个小时了,还是没有运气!
javascript
你需要像
这样的东西http://tablesorter.com PHP,传递值和asc/desc到服务器端,查询如
"SELECT * FROM products WHERE $color='yes' order by price"
请使用mysqli
只需添加ORDER BY子句重做查询。当然对于这样一个简单的查询。
但是,可以将结果读取到数组中,然后使用php ussort函数将其排序为所需的顺序(但是为了有用,您需要在页面刷新之间存储详细信息),或者您可以在客户端机器上使用javascript进行排序(但随后您需要将所有数据下载到客户端,这会破坏分页带来的任何速度提升)
在php中这样做的例子(没有测试过,所以请原谅任何拼写错误):
<?php
switch (true)
{
case is_array($_SESSION['details']) AND $_POST['sort_order'] == 'id' :
$Details = $_SESSION['details'];
usort($Details, 'id_sort');
break;
case is_array($_SESSION['details']) AND $_POST['sort_order'] == 'name' :
$Details = $_SESSION['details'];
usort($Details, 'name_sort');
break;
case is_array($_SESSION['details']) AND $_POST['sort_order'] == 'dob' :
$Details = $_SESSION['details'];
usort($Details, 'dob_sort');
break;
case is_array($_SESSION['details']) AND $_POST['sort_order'] == 'home_town' :
$Details = $_SESSION['details'];
usort($Details, 'home_town_sort');
break;
default :
$sql = "SELECT id, name, dob, home_town FROM Persons";
$Query = $db->query($sql);
$Details = array();
while($row=$db->fetchAssoc($Query))
{
$Details[] = $row;
}
$_SESSION['details'] = $Details;
break;
}
foreach($Details AS $aDetail)
{
echo $aDetail['id']."'t".$aDetail['name']."'t".$aDetail['dob']."'t".$aDetail['home_town']."'r'n";
}
function id_sort($a,$b)
{
$RetVar = 0;
switch (true)
{
case $a['id'] > $b['id'] :
$RetVar = 1;
break;
case $a['id'] < $b['id'] :
$RetVar = -1;
break;
default :
$RetVar = 0;
break;
}
return $RetVar;
}
function name_sort($a,$b)
{
$RetVar = 0;
switch (true)
{
case $a['name'] > $b['name'] :
$RetVar = 1;
break;
case $a['name'] < $b['name'] :
$RetVar = -1;
break;
default :
switch (true)
{
case $a['id'] > $b['id'] :
$RetVar = 1;
break;
case $a['id'] < $b['id'] :
$RetVar = -1;
break;
default :
$RetVar = 0;
break;
}
break;
}
return $RetVar;
}
function dob_sort($a,$b)
{
$RetVar = 0;
switch (true)
{
case $a['dob'] > $b['dob'] :
$RetVar = 1;
break;
case $a['dob'] < $b['dob'] :
$RetVar = -1;
break;
default :
switch (true)
{
case $a['name'] > $b['name'] :
$RetVar = 1;
break;
case $a['name'] < $b['name'] :
$RetVar = -1;
break;
default :
switch (true)
{
case $a['id'] > $b['id'] :
$RetVar = 1;
break;
case $a['id'] < $b['id'] :
$RetVar = -1;
break;
default :
$RetVar = 0;
break;
}
break;
}
break;
}
return $RetVar;
}
function home_town_sort($a,$b)
{
$RetVar = 0;
switch (true)
{
case $a['home_town'] > $b['home_town'] :
$RetVar = 1;
break;
case $a['home_town'] < $b['home_town'] :
$RetVar = -1;
break;
default :
switch (true)
{
case $a['name'] > $b['name'] :
$RetVar = 1;
break;
case $a['name'] < $b['name'] :
$RetVar = -1;
break;
default :
switch (true)
{
case $a['id'] > $b['id'] :
$RetVar = 1;
break;
case $a['id'] < $b['id'] :
$RetVar = -1;
break;
default :
$RetVar = 0;
break;
}
break;
}
}
return $RetVar;
}
?>
这样做的想法是,细节被存储(在这个例子中,我使用了一个会话变量,但同样它可以存储任何其他你想要的方式),如果找到了细节,并传递了排序顺序,那么它使用ussort对细节数组进行排序。每个排序顺序使用一个函数,因此您还可以更改子顺序(即,id应该是唯一的,这样您可以基于它进行排序,但在本例中,home town可能不是唯一的,因此在其中对名称进行排序,然后在其中对id进行排序)。
您不必指定到那个级别的排序,但我认为对于这个示例来说,这是值得的。