我试图查询一个mysql列的名称"5".这将输出名称为“22”的错误列


I try to query a mysql column which has the name "5". This outputs the wrong column which has the name "22"

我试图查询一个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 descorder by 1添加到特殊查询中,第一个选择通常是ID列,第二个选择通常是"Name"列或类似列。它们根据查询(或模式,在*的情况下)中字段的顺序位置进行查询

为了获得名为 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请求。正如其他评论者所指出的,请使用参数化查询。

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

用反号括起列名:

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

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