Php 按HTML表列对查询结果排序

Php 按HTML表列对查询结果排序,php,javascript,html,sorting,Php,Javascript,Html,Sorting,我正在寻找一种更高效、优雅、安全的方式来对HTML表中显示的数据进行排序。这就是我到目前为止所想到的,它看起来有些臃肿 我还想到了一些类似于将排序存储在$\u会话中,这样我就不必“手动”将当前选择的顺序转移到URL中的下一页。也许一个“安全而简单”的JavaScript+PHP(但请不要框架)会有意义吗?我的思绪盘旋了好几个小时 <?php $ro_arr = array( "kid" => "kid", "kwd" => "Keyword", "cpc

我正在寻找一种更高效、优雅、安全的方式来对HTML表中显示的数据进行排序。这就是我到目前为止所想到的,它看起来有些臃肿

我还想到了一些类似于将排序存储在
$\u会话中
,这样我就不必“手动”将当前选择的顺序转移到URL中的下一页。也许一个“安全而简单”的JavaScript+PHP(但请不要框架)会有意义吗?我的思绪盘旋了好几个小时

<?php
$ro_arr = array(
    "kid" => "kid",
    "kwd" => "Keyword",
    "cpc" => "ApproximateCPC",
    "cmp" => "Competition",
    "mov" => "MonthlyValue",
    "gms" => "GlobalMonthlySearches",
    "lms" => "LocalMonthlySearches",
    "dfc" => "KeywordDifficulty",
    "com" => "com",
    "net" => "net",
    "org" => "org",
    );

if (!empty($_GET['ro']) && strlen($_GET['ro']) == 7 && array_key_exists($col = substr($_GET['ro'], 0, 3), $ro_arr)) {
    $dir = (substr($_GET['ro'], 4, 3) == 'asc' ? "ASC" : "DESC");
    $res_order = $res_arr[''. $col .''] ." ". $dir;

} else {
    $_GET['ro'] = "kid_asc";
    $res_order = "kid ASC";
}
?>

<!-- just for testing -->
<pre><?php echo $res_order; ?></pre>
<!-- done testing -->

<table>
  <tr>
    <td><a href="sort.v1.php?ro=<?php echo ($_GET['ro']=='kwd_asc')?"kwd_dsc":"kwd_asc"; ?>">Keyword</a></td>
    <td><a href="sort.v1.php?ro=<?php echo ($_GET['ro']=='cmp_dsc')?"cmp_asc":"cmp_dsc"; ?>">Comp.</a></td>
    <td><a href="sort.v1.php?ro=<?php echo ($_GET['ro']=='cpc_dsc')?"cpc_asc":"cpc_dsc"; ?>">Ad CPC</a></td>
    <td><a href="sort.v1.php?ro=<?php echo ($_GET['ro']=='mov_dsc')?"mov_asc":"mov_dsc"; ?>">Value</a></td>
    <td><a href="sort.v1.php?ro=<?php echo ($_GET['ro']=='gms_dsc')?"gms_asc":"gms_dsc"; ?>">Global Searches</a></td>
    <td><a href="sort.v1.php?ro=<?php echo ($_GET['ro']=='lms_dsc')?"lms_asc":"lms_dsc"; ?>">Local Searches</a></td>
    <td><a href="sort.v1.php?ro=<?php echo ($_GET['ro']=='dfc_asc')?"dfc_dsc":"dfc_asc"; ?>">Difficulty</a></td>
    <td width="22"><a href="sort.v1.php?ro=<?php echo ($_GET['ro']=='com_dsc')?"com_asc":"com_dsc"; ?>">com</a></td>
    <td width="22"><a href="sort.v1.php?ro=<?php echo ($_GET['ro']=='net_dsc')?"net_asc":"net_dsc"; ?>">net</a></td>
    <td width="22"><a href="sort.v1.php?ro=<?php echo ($_GET['ro']=='org_dsc')?"org_asc":"org_dsc"; ?>">org</a></td>
  </tr>
</table>


如果您的表不是太大,并且您不反对使用,请使用。一旦进入数千行,客户端排序可能会有点不灵活。

如果使用两个参数而不是一个参数,则可以将代码量减少近一半:

  • 用于排序的参数:kid、com、net、org
  • 订单:asc、dsc

  • 泰。我也考虑过,但我想我必须为kwd_*和dfc_*使用一个例外。默认情况下,这两个应按ASC排序,而其他的则相反。@Nimmenun我不明白拆分变量时默认行为会受到什么影响。我的意思是-如果最后选择的排序方向是ASC,则所有表头都将显示DESC,除非我为kwd_*和dfc_*添加了异常。我以前曾使用
    explode(“\u”,$\ u GET['ro'])
    拆分列和排序,以保持URL更干净,但现在继续使用我目前拥有的内容。@nimmnen这听起来像是可以通过替换两个例外的顺序轻松修复的东西,它不需要复制整个内容。好的,在做了一些不同的事情之后。。。你的建议在一分钟内就被采纳了我之前可能患有严重的暂时性失明。更新后的代码现在减少了约400字节。TY=)使用“”在客户端进行排序,这比在服务器端进行排序要快得多Side@Venkat遗憾的是,链接是断断续续的。ATM I仅使用10k行进行测试,且仍在0.002-0.005s执行时间范围内。但是“kid”已经设置为unsignedmediumint,希望这就足够了。您是否有使用jQuery+tablesorter的经验?它如何影响缩放?@nimmnen客户端排序在某种程度上取决于返回的数据量。我注意到我的一个项目在大约2k行的速度减慢。它可能会为你改变。要想知道它是否合适,最好的办法是下载并试用。桌面分拣机可以很快地应用,所以您可以尝试一下,不会有任何损失。同样,当你们到达那个种大小的表时,问问你们自己,那个种大小的数据集有多有用或者对用户友好。@JonP+Venkat,你们都说服我对客户端结果处理有更深入的了解。根据设置的过滤器,实际返回的结果数通常在100秒或以下。因为我不仅想保留过滤功能,还想动态加载额外的结果
    onKeyUp()。