MySQL ORDER BY子句中的单引号

时间:2011-08-01 13:08:56

标签: php mysql sql

背景信息

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

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

旧服务器为Win32运行PHP 5.1.2和MySQL 14.12 Distrib 5.0.22。

新服务器运行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版本之间的变化吗?

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

哦,在你们开始讨论注射攻击之前 - 我们已经意识到风险 - 这个网站严格用于内部使用

修改

我找到了这段代码:

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

$orderby可以是dateofpurchase

据我了解,这会导致查询字符串以ORDER BY 'dateofpurchase' DESC结尾?我的眼睛看起来仍然很奇怪。

2 个答案:

答案 0 :(得分:3)

这从来都不正确。

ORDER BY 'id'

...字面意思是“按单词id排序”,而不是名为id的列的值。单引号只能在声明别名时包围标识符。

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

ORDER BY `id`

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

答案 1 :(得分:-1)

我认为你必须只使用双引号。类似的东西:

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

如果字符串由单引号http://it.php.net/manual/en/language.types.string.php#language.types.string.syntax.single

分隔,则PHP无法获取变量