首页 > 解决方案 > SQL 平台中“order by”子句中的参数化

问题描述

order by我想到有时参数化查询在子句中不起作用?

我试过mysql;后勤; C#;

例如:

被忽略的顺序

看到这个https://github.com/brianc/node-postgres/issues/300

使用列名的参数查看此“排序依据”

是否有记录在某处的这种情况的标准参考?Parameterize 在什么平台上不起作用ORDER BY

标签: sql

解决方案


您将字符串值绑定'name'到 sql 中的参数。这意味着对于处理的每一行,SQL 将看到相同的字符串,即'name'.

关键是 'name' 不被解释为name与列名匹配的 Literal,而是'name'已设置或绑定到替换变量的 VARCHAR 值?

在这种情况下,如果您有一个变量ORDER BY子句,您将有两个(或更多)版本的 SQL,您可以使用常规的if//选择它们thenelse

另一种方法是直接连接字符串中的排序列,而不是使用绑定变量。我强烈反对,因为这为未来的 SQL 注入奠定了基础。无论哪种方式,如果将变量输入字符串连接到 SQL,请确保对其进行充分清理和检查以避免出现问题。

PHP 中的连接会很简单,如下所示:

$orderby = "name";
$stmt = $conn->prepare("SELECT id, name FROM user order by ".$orderby." desc");
$stmt->execute();

另请参阅PHP - 在字符串中连接或直接插入变量(必须更正,最初使用仅适用于 PHPecho命令的语法)。

与任何数据库(oracle、MySQL、TSQL 等)结合的所有其他实现语言(C#、Java 等)都将面临相同的问题和解决方案:您必须在 SQL 中区分绑定变量和文字。

如果您仍想使用绑定变量 - 有一种方法,但您必须按如下方式修改您的 sql:

SELECT id, name FROM user 
ORDER BY CASE ? WHEN 'name' THEN name WHEN 'id' THEN id ELSE NULL END

实际上,您(在您的评论中)以某种方式仍然使用绑定变量的想法很好。现在我也不再有 SQL 注入的问题了。但是,现在您需要考虑所有可能发生的排序,并将其编码到您的 SQL 中。


推荐阅读