【问题标题】:Passing Variables to ORDER BY MySQL Statements将变量传递给 ORDER BY MySQL 语句
【发布时间】:2012-09-11 20:40:57
【问题描述】:

我试图在 MySQL 语句中将两个变量传递给 ORDER BY $variable1 $variable2 。变量是从下拉菜单表单中获取的。

PHP

if(isset($_POST['order'])){
         $sort1 = mysql_real_escape_string($_POST['sort']);
         $sort2 = mysql_real_escape_string($_POST['order']);
        }
        if(!@$_POST['order']){
            $sort1 = 'ID';
            $sort2 = 'DESC';
        }
        $topics = mysql_query(" SELECT topic_id AS 'ID', topic_head AS 'Title', 
                                       topic_tags AS 'TAGS', topic_owner AS 'CREATED BY', topic_date AS 'CREATED ON'
                                FROM   forum_topics 
                                ORDER BY '{$sort1}' '{$sort2}'  ") or die (mysql_error());
                        ?>

HTML 表单

<ul class="sort">
        <li><form action="topics.php" method="post">
                <label class="label">Sort Table By</label>
                <select name="sort">
                    <option value ="">    </option>
                    <option value ="ID">ID</option>
                    <option value ="Title">Title</option>
                    <option value ="TAGS">TAGS</option>
                    <option value ="VIEWS">VIEWS</option>
                    <option value ="CREATED ON">CREATED ON</option>
                    <option value ="CREATED BY">CREATED BY</option>
                </select>

                <label class="label">Order By</label>

                <select name = "order" class="tap_Select">
                    <option value ="">    </option>
                    <option value ="ASC">Ascending</option>
                    <option value ="DESC">Descending</option>
                </select>

                <input type="submit" name="order" value="SORT" >
           </form>
        </li>
    </ul>

请帮忙。

更新

当我删除 $sort1 和 $sort2 周围的引号时

我收到此错误: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SORT' at line 4

更新 2

当我执行 $sql = "....." 时,没有通过 mysql_query() 我得到了这个

SELECT topic_id AS 'ID', topic_head AS 'Title', topic_tags AS 'TAGS', topic_owner AS 'CREATED BY', topic_date AS 'CREATED ON' FROM forum_topics ORDER BY ID SORT

【问题讨论】:

  • 您的 HTML 表单中有两个称为“订单”的元素,即选择按钮和提交按钮。

标签: php mysql html


【解决方案1】:

不要使用引号,例如

ORDER BY 'ID' 'DESC'

不正确。应该是

ORDER BY ID DESC

引号将 id 和 desc 转换为纯字符串,而不是关键字/字段名。

【讨论】:

  • @dot:将您的查询构建为$sql = "....",这样您就可以回显您正在构建的字符串。这总是一个好主意,尤其是在调试时 - 更容易看到“真实”查询,而不仅仅是从错误消息中获得的 sn-p。所以... $sql,然后向我们展示你正在构建的查询。
  • @DotOyes - 您的提交按钮被称为 order - 您正在获取它的值而不是具有相同名称的选择。
  • ORDER BY ID SORT 是错误的。正如 andrewsi 所说,您的提交按钮与您的排序方式 &lt;select&gt; 具有相同的 name=,并且提交按钮的值覆盖了选择。
  • 还要注意列名包含空格,所以需要反引号。
  • @andrewsi ,我将提交按钮的名称更改为其他名称,但仍然无效
【解决方案2】:

删除括号并在排序元素之间添加逗号

ORDER BY $sort1 $sort2  ") or die (

编辑:进行以下更改,以便我们可以看到发生了什么...

走这条线

$topics = mysql_query(" SELECT topic_id AS 'ID', topic_head AS 'Title',  
                                   topic_tags AS 'TAGS', topic_owner AS 'CREATED BY', topic_date AS 'CREATED ON' 
                            FROM   forum_topics  
                            ORDER BY '{$sort1}' '{$sort2}'  ") or die (mysql_error()); 

将查询粘贴到变量中,将mysql_query中的字符串替换为变量;

$query="SELECT topic_id AS 'ID', topic_head AS 'Title',  
                                   topic_tags AS 'TAGS', topic_owner AS 'CREATED BY', topic_date AS 'CREATED ON' 
                            FROM   forum_topics  
                            ORDER BY '{$sort1}' '{$sort2}'  ";
$topics = mysql_query($query) or die (mysql_error()); 

然后回显查询并将结果剪切/粘贴到问题中。事情并没有像你想象的那样发生。

echo $query;

【讨论】:

  • 删除了引号和逗号...误读了您对两个“排序”变量的使用,因为它们是单独的 sortby 列与“sortby”和“direction”
  • 查看更新的响应...注意我在示例中保留了您的查询版本
【解决方案3】:

您的列名似乎包含空格,因此您需要使用反引号:

ORDER BY `{$sort1}` {$sort2}

另请注意,mysql_real_escape_string 不提供任何保护 ORDER BY 子句的情况。您需要根据允许输入的白名单检查您的输入。

【讨论】:

  • 如果我从下拉菜单中获取值,这对白名单有帮助吗?您认为什么是白名单?
  • @Dot Oyes 不,永远不要相信用户输入。您需要对列名列表(以及 asc / desc 顺序...)进行硬编码,并对其进行检查。任何人都可以向您的脚本发布任何值。
【解决方案4】:
$topics = mysql_query("SELECT
    topic_id AS `ID`,
    topic_head AS `Title`, 
    topic_tags AS `TAGS`,
    topic_owner AS `CREATED BY`,
    topic_date AS `CREATED ON`
FROM   forum_topics 
ORDER BY {$sort1} {$sort2}'
") or die (mysql_error());

您需要删除 ORDER BY 值周围的'。另请注意别名值周围首选使用的反引号。

还请注意,您应该使用 mysqli_* 或 PDO,因为 mysql_* 已被弃用(请参阅 PHP.net 上大多数 mysql_* 相关功能中的大红色警告。

【讨论】:

  • @DotOyes 如果该错误仍然显示 near 'SORT' 这似乎表明您仍在发送单引号。
  • 您的 oder-by 不正确。 OP 想要同时指定字段和排序方向。您将改为使用两个字段。
  • @MarcB 是的,仔细查看表格,我认为您是对的。我会调整我的答案。
【解决方案5】:

以下语法在 PHP 7.4.12 和 MySQL 5.7.32 中适用于我:

$sort = sanitize_text_field($_POST['sort']; // e.g., 'title'
$order = sanitize_text_field($_POST['order']; // e.g., 'ASC'
$order_by = $sort . ' ' . $order;

$results = $wpdb->get_results( "
    SELECT
        *
    FROM
        MyTable
    ORDER BY
        $order_by
" );

【讨论】:

    猜你喜欢
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2015-08-08
    • 2014-08-22
    相关资源
    最近更新 更多