sql - SQL 平台中“order by”子句中的参数化
问题描述
order by
我想到有时参数化查询在子句中不起作用?
我试过mysql;后勤; C#;
例如:
php+mysql
$stmt = $conn->prepare("SELECT id, name FROM user order by ? desc"); $stmt->bind_param("s", $orderby); $orderby = "name"; $stmt->execute();
被忽略的顺序
- Postgres:
看到这个https://github.com/brianc/node-postgres/issues/300
- .net+mssql:
使用列名的参数查看此“排序依据”
是否有记录在某处的这种情况的标准参考?Parameterize 在什么平台上不起作用ORDER BY
?
解决方案
您将字符串值绑定'name'
到 sql 中的参数。这意味着对于处理的每一行,SQL 将看到相同的字符串,即'name'
.
关键是 'name' 不被解释为name
与列名匹配的 Literal,而是'name'
已设置或绑定到替换变量的 VARCHAR 值?
。
在这种情况下,如果您有一个变量ORDER BY
子句,您将有两个(或更多)版本的 SQL,您可以使用常规的if
//选择它们then
。else
另一种方法是直接连接字符串中的排序列,而不是使用绑定变量。我强烈反对,因为这为未来的 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 中。
推荐阅读
- c# - C# 回调函数不是从 C++ 代码调用的
- android - 类型“_Type”不是“颜色”类型的子类型
- android - 如何保持多边形的状态?
- javascript - node.js 获取返回 index.html 而不是 json 的 post 请求
- angular - NgRx:获取“您在预期流的位置提供了‘未定义’。” 调用完整动作时生效
- python - 有没有比使用 if/elif/elif 等更有效的方法?
- php - Laravel 7.x 在路由组中命名路由
- sql - 为什么 Oracle 在同一索引上使用范围扫描和快速全扫描?
- android - 视频编码器给出不一致的结果
- php - 无法在 PHP 中上传 Azure Blob 存储