Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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 MySQL ORDER BY子句中的单引号_Php_Mysql_Sql - Fatal编程技术网

Php MySQL ORDER BY子句中的单引号

Php MySQL ORDER BY子句中的单引号,php,mysql,sql,Php,Mysql,Sql,背景信息 我是一个不太熟悉MySQL或PHP的人,正在调试另一个人用MySQL和PHP编写的项目:) 该网站正在移动到新服务器。两者都是Windows服务器,通过IIS为PHP提供服务 旧服务器在Win32上运行PHP5.1.2和MySQL 14.12发行版5.0.22 新服务器运行适用于Win64的PHP5.3.6和MySQL 14.14发行版5.1.57 我已经尽了最大努力来匹配.ini文件 为什么引用有效? 在旧服务器上,类似这样的SQL查询似乎可以工作: $db_query = mysq

背景信息

我是一个不太熟悉MySQL或PHP的人,正在调试另一个人用MySQL和PHP编写的项目:)

该网站正在移动到新服务器。两者都是Windows服务器,通过IIS为PHP提供服务

旧服务器在Win32上运行PHP5.1.2和MySQL 14.12发行版5.0.22

新服务器运行适用于Win64的PHP5.3.6和MySQL 14.14发行版5.1.57

我已经尽了最大努力来匹配.ini文件

为什么引用有效?

在旧服务器上,类似这样的SQL查询似乎可以工作:

$db_query = mysql_query("SELECT * FROM $db_table ORDER BY 'id'")
$db_query = mysql_query("SELECT * FROM $db_table ORDER BY '$orderby'")
在新服务器上,除非删除单引号,否则这些查询将失败

为什么这在旧服务器上有效而在新服务器上无效?这是由于MySQL或PHP版本之间的变化造成的吗

为什么编程的人首先会使用单引号

哦,在你们开始谈论注射攻击之前——我们已经意识到了风险——这个网站是仅供内部使用的

编辑

我发现了这段代码:

$db_query_str = $db_query_str . " ORDER BY '$orderby' DESC";
[...code...]
$db_query = $mysql_query($db_query_str);
$orderby
可以是例如
dateofpurchase


据我所知,这将导致一个查询字符串,以'dateofpurchase'DESC结束?这在我看来仍然很奇怪。

这从来都不是正确的

ORDER BY 'id'
…的字面意思是“按单词id排序”,而不是名为id的列的值。只有在声明别名时,单引号才能围绕标识符

这不会在MySQL 5.0.22或5.1.57(或任何5.x或任何4.x)中产生正确的顺序,除非是偶然的(一个表碰巧是按磁盘上的
id
排序的,因为它没有删除/重新插入/重建)


…如果(
$orderby
可以包含用作列名或别名的保留字,这将很好,而且是必要的。

我认为您只需要使用双引号。比如:

$db_query = mysql_query('SELECT * FROM '.$db_table.' ORDER BY "id"');
$db_query = mysql_query('SELECT * FROM '.$db_table.' ORDER BY "'.$orderby.'"');

如果字符串由单引号分隔,PHP不会获取变量。

该$orderby中有什么?注入“攻击”的问题,我们不允许大肆宣扬,不仅是它们可以注入有效代码,还可以注入无效代码。。。所以一个不知情的用户可能会在那里输入一些无效的东西?单引号表示一个字符串,所以
orderby'included'
会按常量值排序=>这就像没有orderby子句一样。我不知道为什么会这样,也许这与一些严格的模式设置有关。MySQL在SQL标准方面可能非常松散(比如GroupBy)@Nanne——也许这有点太令人望而生畏了$orderby从来不是由用户直接设置的,而是由程序员设置的。不,仅用反勾号括起列名,而不是用双引号或单引号括起。谢谢您的回答。我添加了另一个代码示例。你能看到这个例子是如何产生工作代码的吗?我觉得这是正确的。Jesper:检查结果在应用程序中的顺序是否与查询建议的顺序一致。我想订单条款已经有很长一段时间没有按计划运作了,也没有人注意到。也有可能在查询之后以代码对结果进行排序,并且ORDERBY子句完全不相关。
$db_query = mysql_query('SELECT * FROM '.$db_table.' ORDER BY "id"');
$db_query = mysql_query('SELECT * FROM '.$db_table.' ORDER BY "'.$orderby.'"');