我在具有完全根访问权限的专用服务器(Ubuntu Server 8.10)上运行 PHP 5 和 MySQL 5。我正在清理我继承的一些 LAMP 代码,并且我有大量使用这种构造的 SQL 选择:
SELECT ... FROM table WHERE
LCASE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
strSomeField, ' ', '-'), ',', ''), '/', '-'), '&', ''), '+', '')
) = $somevalue
忽略这样一个事实,即数据库不应该被构造为首先需要这样的选择,并且需要参数化 $somevalue 字段以堵塞巨大的安全漏洞,我将 WHERE 条件修复为某事的最佳选择是什么不那么冒犯?如果我使用的是 MSSQL 或 Oracle,我会简单地组合一个用户定义的函数,但我对 MySQL 的经验比较有限,而且我以前没有用它构建过 UDF,尽管我很高兴编写 C 代码。
更新:对于所有已经在原始代码中对此感到惊讶的人来说,$somevalue 实际上类似于 $GET['product']——在主题上有一些变化。在这种情况下,选择是通过产品名称从数据库中拉回产品——在去除字符之后,它与之前可以作为 URI 参数传递的内容相匹配。