3

我尝试查询名称为“5”的 mysql 列。这会输出名称为“22”的错误列。

这是我的 php 代码,$pid是我从 android 应用程序获取的变量,并且始终是一个数字。当我用 搜索时$pid = 5,不是用艺术家 1 获得“5”列,而是用永恒 1 获得“22”列。

基本上它在第一个打印屏幕中将列名与 # 混淆了。如果 # 不存在,则正确搜索;所以如果我用 16 搜索,我会得到第 16 列。我该如何解决这个问题?

$pid = $_GET["pid"];

$result=mysql_query("SELECT * FROM TableComments WHERE `$pid` IS NOT NULL ");

http://imgur.com/WFsfEtB

http://imgur.com/rZA27XC

4

2 回答 2

2

这是我能想到的 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 请求。正如其他评论者所指出的,请改用参数化查询。

由于您尝试修改查询本身而不是参数,因此您可能需要考虑将允许的字段名称列入白名单(或将您发送的字符串与架构中表示的字段进行比较)。

于 2013-05-19T00:54:07.607 回答
1

将列名包装成反引号:

SELECT * FROM TableComments WHERE `$pid` IS NOT NULL

开始使用PDO而不是旧的、不安全的和已弃用的mysql_*

于 2013-05-19T00:48:47.153 回答