【问题标题】:PHP sort multiple columnsPHP对多列进行排序
【发布时间】:2021-08-17 09:42:12
【问题描述】:

使用我的代码,我可以单独对所有列进行排序,但我确实遇到了一个问题,即除了第一列之外,数据没有按字母顺序/时间顺序排序。请看下面显示的内容,然后是我需要看的内容。

当前显示的内容(付款类型和日期未排序):

| Account | Payment type |    Date    | Amount |
|:--------|:------------:|:----------:|-------:|
| A001    | Rent         | 2021-06-01 | 150.00 |
| A001    | Deposit      | 2021-04-15 | 200.00 |
| A001    | Rent         | 2021-05-02 | 150.00 |
| A002    | Deposit      | 2021-06-20 | 220.00 |
| A003    | Rent         | 2021-06-02 | 250.00 |
| A003    | Deposit      | 2021-05-25 | 300.00 |

我想要显示的内容:

| Account | Payment type |    Date    | Amount |
|:--------|:------------:|:----------:|-------:|
| A001    | Deposit      | 2021-04-15 | 200.00 |
| A001    | Rent         | 2021-05-02 | 150.00 |
| A001    | Rent         | 2021-06-01 | 150.00 |
| A002    | Deposit      | 2021-06-20 | 220.00 |
| A003    | Deposit      | 2021-05-25 | 300.00 |
| A003    | Rent         | 2021-06-02 | 250.00 |

简而言之,我想首先按 Account 列(正确显示)然后按 Date 列对数据进行排序和显示。

我目前的代码(是的,我知道它对 sql 注入开放,我正在处理它;-)):

    $orderBy = !empty($_GET["orderby"]) ? $_GET["orderby"] : "contracts_account_nr";
    $order = !empty($_GET["order"]) ? $_GET["order"] : "asc";
    $sql = "SELECT contract.contracts_account_nr, payment.rental_payment_type, payment.rental_payment_amount, payment.rental_payment_date FROM contracts contract RIGHT JOIN rental_payments payment ON contract.contracts_id = payment.contracts_id ORDER BY " . $orderBy . " " . $order;
    $result = mysqli_query($con, $sql); 
    $contractOrder = "asc"; 
    $typeOrder = "asc";  
    $dateOrder = "asc"; 
    if($orderBy == "contract.contracts_account_nr" && $order == "asc") {
    $contractOrder = "desc";    
    }
    if($orderBy == "payment.rental_payment_type" && $order == "asc") {
    $typeOrder = "desc";    
    }
    if($orderBy == "payment.rental_payment_date" && $order == "asc") {
    $dateOrder = "desc";    
    }

您的帮助将不胜感激!

【问题讨论】:

    标签: php mysql sql-order-by


    【解决方案1】:

    准备好的语句的ORDER BY 子句不能被占位符绑定。也就是说,ORDER BY 子句需要修复。所以,就这样做吧:

    SELECT *
    FROM ...
    ORDER BY Account, Date;
    

    如果您想让您的用户能够选择如何排序,那么我建议您根据 PHP 脚本的输入选择一个或多个带有硬编码 ORDER BY 子句的语句。

    【讨论】:

      【解决方案2】:

      请注意此代码,因为您有安全问题:SQL injectionSQL injection on php.net

      $order 和 $orderBy 都使用 GET 方法检索。你至少应该用mysqli_real_escape_string保护他们

      【讨论】:

      • 您也可以创建一个 PDO 对象并使用 $pdo->prepare() 。通过使用准备好的语句,您可以防止 SQL 注入。查询的解析方式与串联不同
      猜你喜欢
      • 2015-11-07
      • 2021-10-14
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      • 2011-06-23
      相关资源
      最近更新 更多