我试图查询一个mysql列的名称为"5"。这将输出名称为"22"的错误列。
这是我的php代码,$pid
是我从android应用程序获得的变量,总是一个数字。当我用$pid = 5
搜索时,不是用artist1获得列"5",而是用eternal1获得列"22"。
基本上它混淆了第一个打印屏幕中的Column Name和#。如果#不存在,则正确搜索;如果我用16搜索,我得到的列是16。我该如何解决这个问题?
$pid = $_GET["pid"];
$result=mysql_query("SELECT * FROM TableComments WHERE `$pid` IS NOT NULL ");
https://i.stack.imgur.com/4nU7e.jpg https://i.stack.imgur.com/mfUEK.jpg 这是我可以立即想到的SQL方言的设计。我知道有几个人出于习惯,将order by 0 desc
或order by 1
添加到特殊查询中,第一个选择通常是ID列,第二个选择通常是"Name"列或类似列。它们根据查询(或模式,在*的情况下)中字段的顺序位置进行查询
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请求。正如其他评论者所指出的,请使用参数化查询。
由于您试图修改查询本身而不是参数,因此您可能需要考虑将允许的字段名称列入白名单(或者将发送的字符串与模式中表示的字段进行比较)。
用反号括起列名:
SELECT * FROM TableComments WHERE `$pid` IS NOT NULL
开始使用PDO
代替旧的、不安全的和已弃用的mysql_*