Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 什么';根据用户的输入来构造WHERE子句是一种常见的做法_Sql_Oracle_Client Side_Where Clause - Fatal编程技术网

Sql 什么';根据用户的输入来构造WHERE子句是一种常见的做法

Sql 什么';根据用户的输入来构造WHERE子句是一种常见的做法,sql,oracle,client-side,where-clause,Sql,Oracle,Client Side,Where Clause,如果采用数据库表,则可以查询所有行,也可以选择对其应用筛选器。根据用户输入,过滤器可能会有所不同。在选项很少的情况下,我们可以为这几个特定条件指定不同的查询。但是,若用户可能指定或不指定很多选项,那个么上述方法就不会派上用场。我知道,我可以根据用户输入编写过滤器,并将其作为字符串作为参数发送到相应的存储过程,使用该过滤器构建查询,最后在execute IMMEDIATE的帮助下执行查询字符串(以Oracle为例)。不知道为什么,但我真的不喜欢这种查询构建方式。我想这样我就为你敞开了大门。此外,我

如果采用数据库表,则可以查询所有行,也可以选择对其应用筛选器。根据用户输入,过滤器可能会有所不同。在选项很少的情况下,我们可以为这几个特定条件指定不同的查询。但是,若用户可能指定或不指定很多选项,那个么上述方法就不会派上用场。我知道,我可以根据用户输入编写过滤器,并将其作为字符串作为参数发送到相应的存储过程,使用该过滤器构建查询,最后在execute IMMEDIATE的帮助下执行查询字符串(以Oracle为例)。不知道为什么,但我真的不喜欢这种查询构建方式。我想这样我就为你敞开了大门。此外,我总是遇到查询本身的问题,因为所有的东西都只是一个字符串,我需要仔细处理日期和数字。对于数据库表形成查询WHERE子句的最佳和最常用的方法是什么?

使用数据库参数而不是试图引用您的文字是前进的道路


这将防止SQL注入。

解决此问题的常见方法是构建表示查询条件的表达式树,将它们转换为参数化SQL(以避免SQL注入风险),将参数值绑定到生成的SQL,并对目标数据库执行结果查询


具体方法取决于您的客户端编程框架:.NET具有实体框架和LINQ2SQL,两者都支持表达式树;Java有Hibernate和JPA等。我见过几个不同的框架用于构建可定制的查询,取得了很大的成功。在这些框架不可用的情况下,您可以使用自己的框架,尽管这需要更多的工作。

使用绑定参数确实可以防止SQL注入。但是,如果可以指定许多选项,那么如何构建过滤器呢。不能保证所有的过滤器选项都会被使用。这意味着我必须检查参数值,如果它不为null,则将其添加到WHERE子句中,否则不为空。这给出了相同的结果。但是我必须有一些东西,比如如果MyPARAM1不是NULL,那么MYWHERE_子句:=MY_where子句| to_CHAR(MyPARAM1)。。。。然后是MY_QUERY:=MY_QUERY | | MY_WHERE_子句等等。我想避免这种情况。如果指定了许多选项,那么您需要包含它们。是的,这很繁重,但这是我们所有人都必须做的事情。