php - 我尝试查询名称为 "5"的 mysql 列。这会输出名称为 "22"的错误列

标签 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

最佳答案

这是在我能想到的 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 中,如果您的 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/

相关文章:

javascript - 创建 chrome 扩展以将数据发送到本地主机服务器

php - codeIgniter 将解析器结果分配给变量

java - JSONException : Value of type java. lang.String解析时无法转换为JSONObject

mysql - 如何跟踪MySQL容器的重启?

php - 检测差错控制算子

php - 如何使用 PHP 将用户随机映射到组中并保持组计数的平等

c++ - Qt中提交QSqlRecord到MySQL数据库

php - 限制子句上的sql注入(inject)

php - 收到错误 fatal error : Call to undefined function mysqli_connect()

mysql - 双重查询错误