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

时间:2013-05-19 00:41:12

标签: php mysql

我尝试查询名为“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 ");

http://imgur.com/WFsfEtB

http://imgur.com/rZA27XC

2 个答案:

答案 0 :(得分:2)

这是我可以想到的SQL方言中的设计。我认识一些人,出于习惯,将order by 0 descorder 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_*