Php 表的ASC和DESC排序之间的更改

Php 表的ASC和DESC排序之间的更改,php,html,Php,Html,这是我正在排序的列: <th><a href="?sort=date">Dato</a></th> $sql = "SELECT * FROM table"; if ($_GET['sort'] == 'date') { $sql .= " ORDER BY date DESC"; } $result =

这是我正在排序的列:

<th><a href="?sort=date">Dato</a></th>
$sql = "SELECT * FROM table";
                  
if ($_GET['sort'] == 'date')
{
    $sql .= " ORDER BY date DESC";
}
                  
$result = $link->query($sql);

当用户再次按下该列时,它将按日期ASC而不是DESC排序,如何添加该列?

您需要添加一个方向变量如果所有代码都在同一个PHP文件中,这可能会更简单

<?php

$direction = 'ASC'; // default

if($_GET['direction'] == 'ASC'){
      $direction = 'DESC';
}

echo '<a href="?sort=date&direction='.$direction.'">Dato</a>';

?>

别着急,我没有检查

如果您想颠倒ASC和DESC之间的顺序,可以添加一个减号,因此如果它已经按日期排序,那么只需在前面添加一个减号即可

以后只要去掉负号,如果它存在,然后颠倒顺序。您还应该为您创建一个函数来创建th标记

鉴于

<th><a href="?sort=<?= ((isset($_GET['sort']) && $_GET['sort'] == 'date') ? '-' : '') ?>date">Dato</a></th>
Nico Haase的更新:理论上应该有一个很好的函数来检查排序列,下面是一个函数可能实现的示例

function isAllowedSearchColumn($sortColumn) {
    return in_array($sortColumn, [
        'date',
        'column2',
        'column3',
        // and so on
    ]);
}

?sort=date&dir=asc,动态创建此字符串并相应地翻转它…@deceze我应该如何通过用户交互翻转它?sort=date&dir=,作为一个非常粗略的轮廓…到目前为止您尝试了什么?你被困在哪里了?一定要确认方向可能只是ASC或DESC,或者你为自己创建了一个SQL注入漏洞…这看起来不太好,因为它打开了SQL注入的魔盒。请永远不要在生产中使用这样的代码,除非你想被黑客攻击;解释一下你的确切意思?应该有一个函数来检查是否存在允许搜索列的列。因此,请解释一下如何进行SQL注入;那个函数在哪里?不要只在理论上使用它。如果您跳过了它,那么在sort参数中插入一些DROP表就不太难了通常当您开始允许对表进行排序时,您不允许只对一列进行排序。你是对的,我的错误是假设这个人也希望能够对其他列进行排序。我想我会把他/她推向正确的方向。但请告诉我,一个名为isAllowedSearchColumn的函数会做什么并不明显。此外,由于函数未定义,他/她无论如何都会在运行此代码时遇到异常。所以,不管怎么说,原始海报中有一个动作是必要的。@NicoHaase您能提供一个您建议的解决方案吗?
$sql = " SELECT * FROM table ";
$sortColumn = (isset($_GET['sort']) ? $_GET['sort'] : '');
$direction = 'ASC';
if (strlen($sortColumn) > 0 && substr($sortColumn, 0, 1) == '-') {
    $sortColumn = substr($sortColumn, 1);
    $direction = 'DESC';
}
if (isAllowedSearchColumn($sortColumn)) {
    $sql .= ' ORDER BY ' . $sortColumn . ' ' . $direction . ' ';
}
$result = $link->query($sql);
function isAllowedSearchColumn($sortColumn) {
    return in_array($sortColumn, [
        'date',
        'column2',
        'column3',
        // and so on
    ]);
}