返回后对MySQL搜索结果进行排序

时间:2013-05-02 09:13:03

标签: php mysql sorting search

我有一个产品页面,显示我网站上出售的所有产品,旁边有链接,允许用户缩小搜索结果范围,例如按颜色。因此,如果他们点击“红色”链接,则只显示红色的产品。设置数据库表,以便每种颜色都具有“是”或“否”的值,因此当单击链接时,查询如下所示:

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

我遇到问题的部分是在结果返回后对结果进行排序。页面上还有其他链接,可以按“价格”和“最新”对返回的结果进行排序。我在如何使用这些排序链接的逻辑上遇到了麻烦。

例如,点击“红色”链接后,我只能看到红色产品。现在我希望能够点击“价格”链接,该链接应按价格仅按红色产品排序。我不知道是否可以在返回结果后对结果进行排序,或者我是否使用附加条件(ORDER BY price)重新查询数据库。如果第二种情况是正确的方法,我如何将条件附加到上一个查询并重新查询数据库?任何人都可以帮我解决这个问题吗?我一直在努力工作几个小时而没有运气!

2 个答案:

答案 0 :(得分:0)

的javascript

你需要像

这样的东西

http://tablesorter.com

PHP,

将值和asc / desc传递给服务器端,查询如

&#34; SELECT * FROM products WHERE $ color =&#39; yes&#39;按价格排序&#34;

请使用mysqli

答案 1 :(得分:0)

只需添加ORDER BY子句重做查询。当然这是一个简单的查询。

然而,可以将结果读入数组,然后使用php usort函数将它们排序为所需的顺序(但是在页面刷新之间需要存储细节才有用),或者你可以排序客户端计算机上的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;
}

?>

这个想法是存储细节(在示例中我使用了会话变量,但同样可以存储您想要的任何其他方式),如果找到详细信息并传递排序顺序,那么它使用usort来排序那些细节。每个排序顺序都使用一个函数,因此您也可以更改子订单(即,id应该是唯一的,因此您可以根据它进行排序,但此示例中的家乡可能不是唯一的,因此在其中排序名称,然后在其中id。。

您不必将排序指定到该级别,但我认为此示例值得。