按HTML表格列排序查询结果

3
我正在寻找一种更加高效、优雅和安全的方式来对HTML表格中显示的数据进行排序。目前,我想到的方法看起来有点臃肿/新手。
我还考虑将排序存储在`$_SESSION` 中,这样我就不必手动在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>

使用“http://www.datatables.net/”进行客户端排序非常快,而不是在服务器端使用。 - Venkat.R
@Venkat,很遗憾那个链接已经失效了。 - Jon P
2个回答

1

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

  1. 您要排序的参数:kid、com、net、org等
  2. 顺序:升序、降序

谢谢。我也考虑过这个问题,但我想我必须使用异常处理来处理kwd_*和dfc_*。这两个默认情况下应该按升序排序,而其他的则相反。 - nimmneun
@nimmneun 我不明白当你分割变量时默认行为应该如何受到影响。 - Nir Alfasi
我的意思是 - 如果上一次选择的排序方向为ASC,则除非我为kwd_*和dfc_*添加异常,否则所有表头都将显示DESC。我以前使用 explode("_", $ _GET ['ro']) 将COLUMN和ORDER拆分以使URL更清晰,但现在已经改变了现有状态。 - nimmneun
@nimmneun听起来好像很容易解决,只需要替换这两个异常的顺序,而不需要复制整个内容。 - Nir Alfasi
好的,经过一段时间的工作之后...你的建议在一分钟内得到了应用 =) 我可能早些时候正在遭受严重的暂时性失明。现在更新后的代码轻了约400字节。谢谢 =) - nimmneun

0
如果你的表格不是太大,而且不排斥使用jQuery,那么可以使用tablsorter。但如果行数超过数千行,客户端排序可能会变得有点不方便。

目前为止,我只使用 10,000 行来进行测试,并且执行时间仍在 0.002-0.005 秒的范围内。但是“kid”已经设置为 unsigned mediumint,希望这已经足够了。你有没有使用过 jQuery+tablesorter 的经验?它对扩展性有什么影响吗? - nimmneun
@nimmneun 客户端排序确实在一定程度上取决于返回的数据量。我注意到我的一个项目在大约2k行时会变慢。这可能对您有所不同。找出它是否适合的最好方法是下载并尝试。表格排序器可以非常快速地应用,因此您可以毫不犹豫地尝试。此外,一旦您达到那个大小的表格,请问自己,那么这样大小的数据集有多有用或用户友好。 - Jon P
@ JonP + Venkat,你们俩说服了我更深入地研究客户端结果处理。根据设定的过滤条件,实际返回的结果数量通常会在100个以下。由于我想保留不仅过滤而且也可以通过'onKeyUp()'动态加载其他结果的能力,我可能需要先深入研究客户端处理。 - nimmneun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接