【发布时间】:2018-01-08 18:39:11
【问题描述】:
假设我的 Web 应用程序中有以下查询模板:
`WHERE UPPER(NAME) LIKE UPPER('%${NAME}%') AND UPPER(LASTNAME) LIKE UPPER('%${LASTNAME}%')`
现在,如果用户在应用程序中为其中一个字段输入空值,会不会影响查询结果?
这可以通过应用程序通过分解查询并在执行期间使用 ifs 构造它来解决,但是对于某些查询,这会使应用程序代码过于复杂。
有没有办法在模板中固有地解决这个问题?仅使用 SQL 语言而不使用应用程序逻辑。
如果我不解决它,如果我只是使用空输入进行查询,那会不会对我的性能影响太大? oracle 是否具有不查询空输入的智能?
基本上:查询NAME LIKE '%%' 之类的内容有多糟糕? Oracle 会忽略这部分查询还是会影响性能(我希望它被忽略,因为这是用户未在表单中输入任何内容的结果)?这是一个简单的示例,但还有更复杂的嵌套查询。
这是一种处理用户未在申请表中输入任何值的懒惰方式,假设他在表单中将name 字段留空,在这种情况下,我希望查询中的所有names 都没有构建一个新模板。
将 Javascript 标记为应用程序语言。
【问题讨论】:
-
在某种程度上,你不能试试看会发生什么吗?如果他们这样做,您希望发生什么?您实际上没有过滤;如果
$NAME为空,您将查找所有非空值,因为您将与'%%'进行比较。那是你要的吗?UPPER(NAME)可能会影响性能,除非您有基于函数的索引。 -
@AlexPoole 如果 $NAME 为空我希望它基本上被忽略,因为用户没有在表单中输入任何内容,我必须使用 UPPER 因为这些是区分大小写的字段。但我想知道 Oracle 是否真的忽略了它,或者我必须分解查询并且不包括要忽略的查询以获得更好的性能。
-
在尝试查询之前验证关键参数。如果缺少某些内容,请告知用户
-
最好的方法是始终确保您的查询是您想要的,以便返回的数据是可预测的。因此,如果有任何参数可能会影响结果集,甚至可能是不正确的。必须更改您的查询,以便您获得所需的内容。这意味着只运行带有参数的查询,这些参数是获取特定数据集作为结果所需的参数
-
理想情况下,无论如何您都不会在浏览器中生成原始 SQL,因为这会带来 SQL 注入攻击的风险,更不用说当
name为O'Brian时的失败以及对数据库游标缓存的影响。
标签: javascript sql oracle web-applications