【问题标题】:PHP sorting by column header issuePHP按列标题问题排序
【发布时间】:2014-10-12 19:51:59
【问题描述】:

我在按列标题对数据表进行排序时遇到问题。

我的网站上有一个构建查询机制,可以接收用户选择的 1 个或多个值。这些值变成 PHP 变量,然后传递到查询中并将数据表打印到屏幕上。地址栏 URL 也会更新。

我希望能够按表格的列标题进行排序。

我将向您展示绕过整个构建查询功能的 PHP 代码。我将从 SORT 部分和查询开始:

<?php

if ($_GET['sort'] == "") {
 $sort_by = "BOL_NUMBER";
} else {
 $sort_by = $_GET['sort'];
}

$select = "";

if ($_SESSION['where'] != "")  {
  $select = "SELECT * FROM `mainTable` WHERE (". $_SESSION['where'] . ") ORDER BY " . $sort_by . "";
}  

// $_SESSION['where'] comes from the build query and can contain 1 or more values

$QueryResult = mysql_query($select) or die ();
$resnum = mysql_num_rows($QueryResult);

下一部分是填充表格的地方:

if ($resnum == 0) {
  echo "no results";
} else {

echo "<table>\n";
echo "<thead><tr>" .
"<th>BOL</th>" .
"<th>CONTAINER</th>" .
"<th>LOCATION</th>" .
"<th>STATUS</th>" .
"</tr></thead><tbody>\n";

while(($Row = mysql_fetch_assoc($QueryResult)) !== FALSE) {
   echo "<tr>";
   echo "<td>{$Row[BOL_NUMBER]}</td>";
   echo "<td>{$Row[CONTAINER_NUMBER]}</td>";
   echo "<td>{$Row[LOCATION_CITY]}</td>";
   echo "<td>{$Row[STATUS_TYPE]}</td>";
   echo "</tr>";
}

echo "</tbody></table>\n";

?>

还有更多列。我刚选了一对。

我为下一部分找到了这个页面:

Sorting html table with a href and php from sql database

所以我尝试将我在链接中读到的内容应用到标题中,如下所示:

 "<th><a href='myPage.php?sort=BOL_NUMBER'>BOL</a></th>" .
 "<th><a href='myPage.php?sort=CONTAINER_NUMBER'>CONTAINER</a></th>" .
 "<th><a href='myPage.php?sort=LOCATION_CITY'>LOCATION</a></th>" .
 "<th><a href='myPage.php?sort=STATUS_TYPE'>STATUS</a></th>" .

现在,我可以单击列标题,但是当我这样做时,它不会保留用户的选择,我可以知道,因为 URL 会像下面的示例一样发生变化:

(这只是一个例子,不包括上表中的参数) (请注意此网址中的 &sort)

 http://home.someCompany.com/myAPP/mypage.php?direction=I&type=&submit=Go&city=&pod=&terminal=&ramp=&container=&bol=&voyage=&conStatus=&con_location=&sort=&status=

将更改为此(如果我选择 CONTAINER 的标题):

 http://home.someCompany.com/myAPP/mypage.php?&sort=CONTAINER_NUMBER

发生这种情况时,数据表将不再显示在屏幕上。就像它从查询中删除所有内容并仅添加排序一样。但现在没有什么可排序的了。

【问题讨论】:

  • 为什么要使用数据库排序?尝试使用大量基于 JS 的表格排序插件(例如 tablesorter.com
  • 一种解决方案是将所有其他参数保留在会话变量中。另一种方法是让 PHP 为列标题构造一个完整的 URL,方法是将 sort 选项与它收到的所有 $_GET 查询参数合并。 http_build_query 函数对此很有用。
  • 还应该注意的是,您正在将原始数据传递到 mysql_query(这非常危险),从而使您面临注入攻击等等。您至少应该转义注入的参数($_GET)或切换到不推荐使用的数据库库,如 PDO 或 mysqli_*
  • @drmarvelous,我确实在构建查询机制中使用了 mysql_real_escape_string。我只是没有显示它。
  • @drmarvelous,我正在查看 tablesorter.com。我是否必须更改大部分现有代码才能使用 tablesorter.com?

标签: php mysql sorting html-table


【解决方案1】:

$_SERVER['QUERY_STRING'] 超全局变量使您可以访问GET 参数。通过使用它可以保持请求的当前参数。

因此,通过以下方式更改您的链接:

$urlQuery = str_replace(array('&sort=BOL_NUMBER', '&sort=CONTAINER_NUMBER', '&sort=LOCATION_CITY', '&sort=STATUS_TYPE'), '', $_SERVER['QUERY_STRING']); // To clean previous sorting, maybe replace by a regex

"<th><a href='myPage.php?' . $urlQuery  . '&sort=BOL_NUMBER'>BOL</a></th>" .
"<th><a href='myPage.php?' . $urlQuery  . '&sort=CONTAINER_NUMBER'>CONTAINER</a></th>" .
"<th><a href='myPage.php?' . $urlQuery  . '&sort=LOCATION_CITY'>LOCATION</a></th>" .
"<th><a href='myPage.php?' . $urlQuery  . '&sort=STATUS_TYPE'>STATUS</a></th>" .

你应该达到你的目标。

【讨论】:

    猜你喜欢
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2010-09-16
    相关资源
    最近更新 更多