如何在PHP脚本中最好地从MySQL表中排序数据?

时间:2012-06-06 16:49:51

标签: php mysql sorting

我在PHP中有一个像这样的脚本:

if(isset($_GET["ord"]))
{
    switch($_GET["ord"])
    {
      case 1: $ord = "name ASC";
              break;

      case 2: $ord = "surname ASC";
              break;

      case 3: $ord = "date ASC";
              break;

      case 4: $ord = "zone ASC";
              break;

      case 5: $ord = "latency DESC";
              break;

      default: $ord = "name ASC";
               break;

    }
}
else
{
    $ord = "name ASC";
}

在像这样的代码中使用它:

$res = mysql_query("SELECT people.name AS Name, surname, date, zone, latency FROM people WHERE online=1 ORDER BY $ord");
$content->ADD('<table class="online"><tr><th><a href="?s=online&amp;ord=1">Name</a></th><th><a href="?s=online&amp;ord=2">Surname</a></th><th><a href="?s=online&amp;ord=3">Date</a></th><th><a href="?s=online&amp;ord=4">Zone</a></th><th><a href="?s=online&amp;ord=5">Latency</a></th></tr>');
while ($resss = mysql_fetch_array($res))
{
  $content->ADD('<tr><td align="center">'.$resss["name"].'</td>');
  $content->ADD('<td>'.$resss["surname"].'</td>');
  $content->ADD('<td>'.$resss["date"].'</td>');
  $content->ADD('<td>'.$resss["zone"].'</td>');
  $content->ADD('<td>'.$resss["latency"].'</td>');
  $content->ADD('</tr>');

}

它实际上工作非常棒但是当我需要更改ASC和DESC排序时我有问题 - 所以我的问题是如何重写我的脚本也可以在输出数据中使用acs / desc排序?谢谢。

3 个答案:

答案 0 :(得分:2)

如果您不介意的话,我只能想到jQuery解决方案:jQuery DataTables plugin。使用它将消除不必要地调用数据库的需要。

最基本的实现是:

$(document).ready(function(){
    $('#example').dataTable();
});

答案 1 :(得分:1)

假设您有一个带名称的标题行,例如:

$content->ADD('<tr><td align="center">Name</td>');

您可以将其更改为:

$sort_order = "name ASC";
if($ord == 'name ASC') {
    $sort_order = "name DESC";
}
$content->ADD('<tr><td align="center"><a href="?ord=$sort_order">Name</a></td>');

然后,当您的脚本处理“ord”变量时,它将基于您的“名称”列标题。一旦你开始这样做,你可能想要改变你的变量,使用类似“?sortby = name&amp; sortorder = ASC”的请求变量,但先完成上述工作,然后你会看到它。 / p>

答案 2 :(得分:0)

整个开关有点不必要。执行ORDER BY时,您可以指定要在查询中按其数字位置(顺序)排序的列。

select `uid`, `name` from `test` order by `uid` asc

应该提供与

相同的结果
select `uid`, `name` from `test` order by 1 asc

您可以使用开关修改代码以接受desc / asc的参数,并只使用数字作为order by目标。您发布的交换机的好处是不会产生奇怪的查询,例如order by 555,但这也可以通过其他方式解决。这只是帮助您开始编码的一些基本信息,但如果您需要澄清,请发表评论