【问题标题】:Sorting MySQL Search Results AFTER Return返回后对 MySQL 搜索结果进行排序
【发布时间】:2013-05-02 09:13:02
【问题描述】:

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

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 )重新查询数据库。如果第二种情况是正确的方法,我如何将条件附加到前一个查询并重新查询数据库?谁能帮我解决这个问题?我已经为此工作了几个小时,但没有运气!

【问题讨论】:

  • 查询只是字符串,所以修改查询应该不会那么难。顺便说一句,您将需要使用准备好的语句,或者使用适当的 SQL 转义;你现在拥有的是危险代码。
  • 如上所示,我有一个自定义的“过滤器”功能来过滤掉查询字符串中的有害输入。
  • 嗯,好吧,我看到请求值用于列名,因此准备好的语句在这种情况下实际上不起作用。 ..也就是说,你可能仍然应该使用它=D
  • 无论如何我都不是 SQL 专家。你能解释一下我的代码有多危险吗?
  • 取决于过滤器函数的作用(如果可能过滤可能的值或使用 mysql_real_escape_string),但您的脚本可能对 SQL 注入开放。如果有人在颜色字段中输入了类似“1;SELECT * FROM PasswordsTable #”的内容,他们可能会得到一些您希望隐藏的数据。

标签: php mysql sorting search


【解决方案1】:

javascript

你需要类似的东西

http://tablesorter.com

PHP ,

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

“SELECT * FROM products WHERE $color='yes' order by price”

请使用mysqli

【讨论】:

  • 谢谢,但这会起作用。客户有一个非常具体的设计,这不合适。我在搜索结果上方只有两个链接,用于按价格和最新排序。
【解决方案2】:

只需添加 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 在其中)。

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

【讨论】:

  • 没有 jquery,它是 PHP。我知道如何在简单查询中使用 ORDER BY,但我试图在初始查询之后使用它。如何将 ORDER BY 子句添加到已经完成的查询?
  • 您可以像这样将其添加到查询中。您要么需要使用不同的 order by 子句重做查询,要么对已经检索到的结果集进行排序(在 php 中的服务器端或在 javascript 中的客户端)。
  • 您能否提供一个简单的示例来说明如何使用 PHP 对我检索到的结果集进行排序?刚看了usort的文档,头疼!
猜你喜欢
  • 2021-08-19
  • 2021-04-06
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 2014-03-20
  • 2011-11-26
  • 2013-04-28
  • 2016-05-21
相关资源
最近更新 更多