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/

相关文章:

mysql - 群组功能不支持引用

mysql - 将 CASE 行与不同的值相乘

php - PHP 5.6u 和 PHP 5.6w 的区别

php - XPath递归删除空的DOM节点?

php - Mysqli 查询没有返回任何结果

mysql - Cakephp 的 SQL JOIN 查询

php - SELECT LAST_INSERT_ID() 间歇性返回 0

PHP 正则表达式和相邻的捕获组

java - 无法将java ee spring项目连接到mysql

javascript - AJAX 在页面加载之前运行 onchange 事件