Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我尝试查询一个名为“5”的mysql列。这将输出名称为“22”的错误列_Php_Mysql - Fatal编程技术网

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

Php 我尝试查询一个名为“5”的mysql列。这将输出名称为“22”的错误列,php,mysql,Php,Mysql,我尝试查询一个名为5的mysql列。这将输出名称为22的错误列 这是我的php代码,$pid是我从android应用程序获得的变量,始终是一个数字。当我使用$pid=5进行搜索时,不是使用artist1获取第5列,而是使用eternal1获取第22列 基本上,它混淆了列名和第一个打印屏幕中的列名。如果不存在,则正确搜索;所以如果我用16搜索,我会得到16列。我该如何解决这个问题 $pid = $_GET["pid"]; $result=mysql_query("SELECT * FROM Ta

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


将列名换行为反勾号:

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

开始使用PDO,而不是旧的、不安全的、不推荐使用的mysql。\u*

这是用SQL方言设计的,我可以马上想到。我认识几个人,出于习惯,他们会在临时查询中添加order by 0 desc或order by 1,第一个选择通常是ID列,第二个选择通常是名称列或类似列。它们根据字段在查询或模式中的顺序位置进行查询,例如*

为了获得名为5的列,您需要为您的方言和配置使用适当的SQL引用机制。例如,Microsoft Sql和Access通常会使用select*from tablecomments,其中[5]=5;在Postgres和Oracle中,您将使用select*from tablecomments,其中5=5;在Mysql中,引用的标识符将使用backtick select*from tablecomments,其中'5`=5。在MicrosoftSQL中,如果会话已将QUOTED_标识符设置为ON,您还可以使内容更像Oracle和Postgres,在这种情况下,您可以使用quotes而不是方括号

顺便说一句,但非常重要的一点是,您不应该将用户输入直接嵌入到SQL中。如果有人用Charles或Fiddler这样的代理截获Android应用程序和PHP应用程序之间的HTTP传输,他们将能够使用任意SQL注入重播HTTP请求。正如其他评论者所指出的,请改用参数化查询


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

$MultQuyQuyStay* *从表符中,其中PID=5具有从一个数字开始的列名是自找麻烦。不过,我真正想知道的是,想出这个命名方案的人的想法。你的代码很容易受到SQL注入攻击,如果你还没有受到攻击,你就会被黑客攻击。学习将准备好的/参数化的查询与PDO或类似的方法一起使用,以完全避免这个问题。问题是,当参数是列名时,进行参数化查询并不是一件小事。但是,是的,在这个特定的查询中,至少应该有intval$pid。在MySql中,它是反勾号而不是双引号。Postgres是双引号。不能为OracleCorrect说话。我对MySql的记忆是模糊的,包括我的头在桌子上的大量撞击;但是OP的代码似乎已经包含了反勾号…看起来你是对的;在第一次编辑中,我的反应并不明显,但我没有注意到michi的修订。我想我必须拿出一个Mysql实例来弄清楚到底发生了什么,我现在没有现成的postgres和sqlite,我的盒子里只有这些谢谢你的回答。我开始研究PDO,除了防止SQL注入之外,它实际上解决了这个特殊问题。由于StackOverflow的wikitext方言中的反勾号的含义,这有点令人困惑,但我认为OP的代码已经是这样的:谢谢你的回答。我开始研究PDO,除了防止SQL注入之外,它实际上解决了这个特殊的问题。