我尝试查询名为“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 ");
最佳答案
这是在我能想到的 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 中,如果您的 session 设置了 SET QUOTED_IDENTIFIER ON,您还可以使事情更像 Oracle 和 Postgres,在这种情况下,您将使用引号而不是方括号。
顺便说一句,但这是非常重要的一点,您不应该接受用户输入并将其直接嵌入到 SQL 中。如果有人要拦截你的 Android 应用程序和你的 PHP 应用程序之间的 HTTP 传输(使用像 Charles 或 Fiddler 这样的代理是微不足道的),他们将能够重放注入(inject)任意 SQL 的 http 请求。正如其他评论者所指出的,请改用参数化查询。
由于您尝试修改查询本身而不是参数,因此您可能需要考虑将允许的字段名称列入白名单(或将您发送的字符串与架构中表示的字段进行比较)。
关于php - 我尝试查询名称为 "5"的 mysql 列。这会输出名称为 "22"的错误列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16630399/