背景信息
我是一个不熟悉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
结尾?我的眼睛看起来仍然很奇怪。
答案 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无法获取变量