php - MySQL ORDER BY 子句中的单引号

标签 php mysql sql

背景信息

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

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

旧服务器运行 PHP 5.1.2 和 MySQL 14.12 Distrib 5.0.22,适用于 Win32。

新服务器运行 PHP 5.3.6 和 MySQL 14.14 Distrib 5.1.57,适用于 Win64

我已尽力匹配 .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 版本之间的变化吗?

为什么编写它的人首先要使用单引号?

哦,在你们开始狂热地谈论注入(inject)攻击之前 - 我们知道其中的风险 - 本网站仅供内部使用

编辑

我找到了这段代码:

$db_query_str = $db_query_str . " ORDER BY '$orderby' DESC";
[...code...]
$db_query = $mysql_query($db_query_str);

$orderby 可以是例如 dateofpurchase

据我所知,这会导致查询字符串以 ORDER BY 'dateofpurchase' DESC 结尾吗?在我看来,这仍然很奇怪。

最佳答案

这从来都不正确。

ORDER BY 'id'

...从字面上看,“按单词 id 排序”,而不是名为 id 的列的值。单引号只能在声明别名时将标识符括起来。

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

ORDER BY `id`

...如果 $orderby 可以包含您用作列名或别名的保留字,那就没问题,而且是必要的。

关于php - MySQL ORDER BY 子句中的单引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6898851/

相关文章:

php - PHP 中类似 Disqus 的评论线程逻辑

php - 如何根据一些值来定义趋势?

php - 使用 PHP 调试数组的最佳方法

mysql - 从具有不同值的两个字段中删除mysql表中的重复项

php - 在 Linux 服务器上使用带有 php 的模板生成一个 word 文件

mysql - 保存统计mysql

python - 在 k 个数组中查找第 a 到第 b 个最小元素的有效方法

mysql - 如何创建变量并将其传递给另一个查询?

MySQL - 如何根据单列查找重复行?

php - 无法使用 MSSQL 在 PDO 中引用表名