我尝试查询名为“5”的mysql列。这将输出名为“22”的错误列。
这是我的php代码,$pid
是我从android应用程序获取的变量,并且始终是一个数字。当我使用$pid = 5
进行搜索时,不是使用artist1获取列“5”,而是使用eternal1获取列“22”。
基本上它会在第一个打印屏幕中将列名与#混淆。如果#不存在,则正确搜索;所以如果我用16搜索,我会得到第16列。如何解决这个问题?
$pid = $_GET["pid"];
$result=mysql_query("SELECT * FROM TableComments WHERE `$pid` IS NOT NULL ");
答案 0 :(得分: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请求。正如其他评论者所指出的那样,请使用参数化查询。
由于您尝试修改查询本身而不是参数,因此您可能需要考虑将允许的字段名称列入白名单(或者将您发送的字符串与模式中表示的字段进行比较)。
答案 1 :(得分:1)
将列名包装成反引号:
SELECT * FROM TableComments WHERE `$pid` IS NOT NULL
开始使用PDO
而不是旧的,不安全的,已弃用mysql_*