php - 我怎样才能清理这个 SELECT 查询?

标签 php sql mysql user-defined-functions

我在具有完全 root 访问权限的专用服务器(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 参数传递的内容相匹配。

最佳答案

what is my best option for fixing the WHERE condition into something less offensive?

在应用程序层进行替换,没有调用该逻辑在数据库中。使其成为一个普通的旧 PHP 函数。

ETA:啊,我明白你的意思了。然后你就吃饱了,剩下的就是“数据库一开始就不应该被构造为需要这样的选择”! :-) 您可以将 REPLACE 移至存储产品 ( CREATE FUNCTION )...这肯定会使查询看起来更好,但它实际上是把问题掩盖起来了仍然需要扫描并处理整个表才能进行 SELECT 查询。抱歉,我认为如果不更改架构,您无法做得更好。

(我猜这是一个从文本标题中获取“干净的”ID 样式标记的函数?通常情况下,您确实会在普通的旧 PHP 函数中执行此操作,并将其存储为与“真实”标题。然后您可以轻松选择它,并为其建立索引以提高性能。)

关于php - 我怎样才能清理这个 SELECT 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/587422/

相关文章:

PHP - 使用数组外部数组中的值

sql - 使用带有自定义超时的 SqlCommandProvider

sql - TSQL:是否有办法限制返回的行并计算没有限制的返回总数(不将其添加到每一行)?

asp.net - 可以安全地删除未使用的 ASP.NET 成员资格表吗?

php - 动态创建的多选框值未正确插入

php - 如何使用 Eloquent 从嵌套关系中加载特定字段?

php - 如何将电子邮件发送到通过 php mailer 从数据库中获取的地址

PHP/MYSQL - 备份秒变的mysql数据

c# - 从 mysql 数据库将图像加载到 picturebox 时出错。空引用异常

mysql - 当我同时将字符串插入表中时,该字符串用逗号分隔,子字符串将插入到另一个表中(表2)