背景信息
我是一个不太熟悉 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/