【问题标题】:PHP GET MySQL order by if not empty echo else echo howPHP GET MySQL order by if not empty echo else echo how
【发布时间】:2015-09-17 19:39:08
【问题描述】:

我有一个显示所有库存产品的页面,我希望它们按 ID 或名称或日期等排序。

一种方法是通过表格行标题上的链接获取订单并像这样获取它

$order_by = $_GET['order'];
if (!empty($order_by)) {
    echo "id";
} else {
    echo "$order_by";
}

现在我们必须以某种方式将其回显到查询中,但我不知道如何,查询是这样的:

$result = mysqli_query($database,"SELECT * FROM `stock` order by `id` ASC");
$rows = mysqli_num_rows($result);
if (mysqli_num_rows($result) > 0) {

我尝试通过将订单替换为“id”来插入整个 PHP $order_,但它给了我错误。

知道如何实现吗?

【问题讨论】:

  • 这是有效的 php 吗?大括号外面的分号?
  • 您的 ORDER BY 子句需要替换为 PHP:“SELECT * FROM stock ORDER BY $order_by ASC”。 (注意 $order_by 必须是一个有效的列名,否则你会得到一个错误。
  • 错误是调试代码时最重要的信息之一。如果您不将其添加到您的问题中,则无法为您提供帮助。

标签: php html mysql sql database


【解决方案1】:

首先您需要检查$_GET['order'] 是否有效,使用in_array() 并检查收到的订单是否在允许值数组(白名单数组)中。我认为 mysqli_real_escape_string() 不足以保护 order by 子句,因为它是列名,而不是值。如果验证失败,请使用默认列名 (id)。

$order_whitelist = [ 'id', 'name', 'date' ];

if ( !empty( $_GET['order'] ) && in_array( $_GET['order'], $order_whitelist, true ) )
    $order_by = $_GET['order'];
else
    $order_by = 'id';

现在可以安全地构建查询,为此sprintf() 函数可能很有用。

$result = mysqli_query( $database, sprintf( "SELECT * FROM `stock` order by `%s` ASC", $order_by ) );

【讨论】:

    【解决方案2】:

    整个“order by”不需要替换。只需插入您想要订购的东西。

    <?php
    $order_by = $_GET['order'];
    if(!empty($order_by)){
        $result=mysqli_query($database,"SELECT * FROM `stock` order by `".$order_by."` ASC");
        $rows=mysqli_num_rows($result);
        if(mysqli_num_rows($result)>0) {do something}
    ?>
    

    请注意,这未经过清理,可能会导致 SQL 注入。

    【讨论】:

    • (不为空)或(不要以子句开头)
    【解决方案3】:

    你可以使用这样的东西:-

    $order_by = $_GET['order'];
    
        if(empty($order_by)){
                $order_by='id';
        }
    
        if(!empty($order_by)){
            $result=mysqli_query($database,"SELECT * FROM `stock` order by `".$order_by."` ASC");
    
            $rows=mysqli_num_rows($result);
            if(mysqli_num_rows($result)>0){
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多