PHP - 如何通过升序或降序来订购数据

时间:2015-01-27 22:34:39

标签: php mysql sql mysqli

我有一个允许用户从数据库中检索信息的表单。

目前,用户可以使用我提供的代码从数据库中检索信息(可能编码很糟糕,但是有效)。

现在我希望数据以asc或dsc顺序显示,具体取决于用户在表单上选择的内容。但我不太确定如何去做,在正确的方向上的任何帮助将非常感激!

检索信息的PHP:

$sql = "SELECT RunnerID, EventID, Date, FinishTime, Position, CategoryID, AgeGrade, PB FROM Results";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
 echo "<table><tr><th>RunnerID</th><th>EventID</th><th>Date</th><th>FinishTime</th><th>Position</th><th>CategoryID</th><th>AgeGrade</th><th>PB</th></tr>";

 while($row = $result->fetch_assoc()) {
     echo "<tr><td>" . $row["RunnerID"]. "</td><td>" . $row["EventID"]. " </td><td>" . $row["Date"]. " </td><td>" . $row["FinishTime"]. " </td><td>" . $row["Position"]. " </td><td>" . $row["CategoryID"]. " </td><td>" . $row["AgeGrade"]. " </td><td>" . $row["PB"]. " </td></tr>";
 }
 echo "</table>";
} 
else {
 echo "Error";
}

3 个答案:

答案 0 :(得分:2)

修改SQL查询以包含ORDER BY xxxx ASCORDER BY xxxx DESC更为标准,而不是让PHP完成工作。如果你有一个你想让它们排序的表格,那么一个不错的选择可能是:

$userSelectedProperty = $_GET['ThePropertyIWantToSortOn'];
$userSelectedDirection = $_GET['TheDirectionIWantToSortBy'];
$sql = "SELECT RunnerID, EventID ... FROM Results ORDER BY "; // Note the extra space
switch ($userSelectedProperty)
{
    case 'name': { $sql .= "RunnerName"; break; }
    case 'age': { $sql .= "AgeGrade"; break; }
    ...
    default: { $sql .= "RunnerID"; break; } // By default, let's sort by ID
}
if ($userSelectedDirection == 'desc')
{
   $sql .= " DESC"; // Note the preceding space.
}
else
{
   $sql .= " ASC"; // Note the preceding space.
}

这样,已经对数据库进行了排序,因此您可以按照所需的顺序检索数据。我之所以使用switch语句和if语句,即使它看起来像是相同的数据,也是因为它避免了一个称为 SQL注入的漏洞。基本上,如果您只是直接使用该变量来构建SQL查询,那么就没有什么能阻止某些恶意用户提供允许他们修改查询意图的代码。例如,如果他们传递了MyName; DELETE FROM Results;之类的内容作为用于生成字段$userSelectedProperty的表单输入的值,则生成的$sql字符串将类似于SELECT RunnerID ... FROM Results ORDER BY MyName; DELETE FROM Results;。好吧,那个非常糟糕因为对SQL来说,它是两个有效的陈述。如果这是您第一次听到它,这不是最佳或最全面的定义,但如果您对如何避免它有好奇心,我建议您查看SQL注入指南。

答案 1 :(得分:0)

$fields = array( "RunnerID", "EventID", "Date", "FinishTime", "Position", "CategoryID" );

    $orderby = 0;
    $asc = 0;
    if( isset($_GET['orderby'])) $orderby = (int)$_GET['orderby'];
    if( isset($_GET['asc'])) $asc = (int)$_GET['asc'];

    $sql = "SELECT RunnerID, EventID, Date, FinishTime, Position, CategoryID, AgeGrade, PB FROM Results";

$sql .= " ORDER BY " . $fields[$orderby];
$sql .= " " . $asc ? "ASC" : "DESC";

答案 2 :(得分:0)

不要让服务器完成工作,而应考虑让浏览器代替它。将工作卸载到浏览器是一项非常有用的技能,尤其是对于非常繁忙的网站。

将数据放入表中而不考虑排序顺序。然后使用JavaScript实现排序。有很多方法可以做到这一点,例如:

var tbl = document.getElementById('mytable'),
    trs = tbl.rows, l = trs.length, i, tmp = [];
for( i=0; i<l; i++) tmp.push(trs[i]);
tmp.sort(function(a,b) {
    // compare the rows how you want.
    // return -1 if a comes before b
    // return 1 if b comes before a
    // return 0 if they are equal
});
for( i=0; i<l; i++) tbl.appendChild(tmp[i]);

您还可以在互联网上查看其中一个插件来执行此操作,例如Footable。

当然,您可以随时通过以下方式支持非JS用户(他们的过时程度如何?)

<noscript><a href="?sort=asc">Sort ascending</a></noscript>

当存在该参数时,根据其他答案对其进行排序服务器端。但绝大多数情况下,它都是用JavaScript完成的。​​