这是我能想到的 SQL 方言的设计。我认识几个出于习惯添加order by 0 desc
或添加order by 1
到临时查询的人,第一个选择通常是 ID 列,第二个选择通常是“名称”列或类似列。他们根据查询中字段的序号位置(或架构,在 * 的情况下)进行查询
为了获得名为5 的列,您需要为您的方言和配置使用适当的 SQL 引用机制。例如,Microsoft Sql 和 Access 通常会使用select * from tablecomments where [5]=5
; 在 Postgres 和 Oracle 中,您将使用select * from tablecomments where "5"=5
,而在 Mysql 中,带引号的标识符用反引号引用select * from tablecomments where `5`=5
。在 Microsoft SQL 中,如果您的会话设置了 SET QUOTED_IDENTIFIER ON,您还可以使事情更像 Oracle 和 Postgres,在这种情况下,您将使用引号而不是方括号。
顺便说一句,但非常重要的是,您不应该接受用户输入并将其直接嵌入到 SQL 中。如果有人要拦截您的 Android 应用程序和您的 PHP 应用程序之间的 HTTP 传输(对于像 Charles 或 Fiddler 这样的代理来说很简单),他们将能够通过注入任意 SQL 来重放 HTTP 请求。正如其他评论者所指出的,请改用参数化查询。
由于您尝试修改查询本身而不是参数,因此您可能需要考虑将允许的字段名称列入白名单(或将您发送的字符串与架构中表示的字段进行比较)。