Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
通过基于三个过滤器的concating条件创建一个简单的SQL查询—Java&;MySQL_Java_Mysql_Sql - Fatal编程技术网

通过基于三个过滤器的concating条件创建一个简单的SQL查询—Java&;MySQL

通过基于三个过滤器的concating条件创建一个简单的SQL查询—Java&;MySQL,java,mysql,sql,Java,Mysql,Sql,我有三个HTMLSelect标记。内容如下: 所有人、用户、来宾 全部,批准,拒绝 所有的,公共的,私人的 我正在做以下工作: String by = //Some Code to get this value String status = //Some Code to get this value String privacy = //Some Code to get this value String searchQuery = "SELECT * FROM requests"; if

我有三个HTMLSelect标记。内容如下:

  • 所有人、用户、来宾
  • 全部,批准,拒绝
  • 所有的,公共的,私人的
  • 我正在做以下工作:

    String by = //Some Code to get this value
    String status = //Some Code to get this value
    String privacy = //Some Code to get this value
    
    String searchQuery = "SELECT * FROM requests";
    
    if(!by.equalsIgnoreCase("all")){
        searchQuery += " WHERE SEARCH_BY='" + by + "'";;
    }
    
    if(!status.equalsIgnoreCase("all")){
        searchQuery += " WHERE SEARCH_STATUS='" + status + "'";;
    }
    
    if(!privacy.equalsIgnoreCase("all")){
        searchQuery += " WHERE SEARCH_PRIVACY='" + privacy + "'";;
    }
    
    仅当用户仅更改一个标记时,此查询才有效。但是,如果他更改两个select标记:
    searchQuery
    将如下所示:

    SELECT * FROM requests WHERE SEARCH_BY='Users' WHERE SEARCH_STATUS='Rejected'
    
    我知道我可以使用
    关键字,比如:
    WHERE this condition和that condition

    但是知道
    此条件
    存在的可能性有多大(仅当此选择标记未更改时),它会使我的查询如下:
    何处和该条件

    最后,我需要的是:

    Select * FROM requests WHERE SEARCH_BY='A' AND SEARCH_STATUS='B' AND SEARCH_PRIVACY='C';
    
    其中
    A
    B
    C
    可以是全部或一个值。当它完成时,我希望它包含来自数据库的所有结果

    类似于:
    WHERE SEARCH\u BY='all'
    应将数据库的所有行返回到
    all
    关键字,而不是将
    SEARCH\u BY
    列的值与之匹配。

    尝试以下操作:

    String searchQuery = "SELECT * FROM requests where 1=1";
    
    if(!by.equalsIgnoreCase("all")){
        searchQuery += " AND SEARCH_BY='" + by + "'";;
    }
    
    if(!status.equalsIgnoreCase("all")){
        searchQuery += " AND SEARCH_STATUS='" + status + "'";;
    }
    
    if(!privacy.equalsIgnoreCase("all")){
        searchQuery += " AND SEARCH_PRIVACY='" + privacy + "'";;
    }
    
    这使用了一个虚拟条件,因此无论满足多少其他条件,它们都将被添加为

    尝试以下操作:

    String searchQuery = "SELECT * FROM requests where 1=1";
    
    if(!by.equalsIgnoreCase("all")){
        searchQuery += " AND SEARCH_BY='" + by + "'";;
    }
    
    if(!status.equalsIgnoreCase("all")){
        searchQuery += " AND SEARCH_STATUS='" + status + "'";;
    }
    
    if(!privacy.equalsIgnoreCase("all")){
        searchQuery += " AND SEARCH_PRIVACY='" + privacy + "'";;
    }
    
    这使用了一个虚拟条件,因此无论满足多少其他条件,它们都将被添加为
    首先确保“by”、“status”和“privacy”值与选择选项相等。这样编写的代码可能会成为SQL注入的牺牲品。有很多方法可以做到这一点。一个简单的例子是:

    public enum EBy {
        All, Users, Guests
    }
    public enum EStatus {
        All, Approved, Rejected
    }
    public enum EPrivacy {
        All, Public, Private
    }
    EBy eBy = EBy.valueOf(by);
    EStatus eStatus = EStatus.valueOf(status);
    EPrivacy ePrivacy = EPrivacy.valueOf(privacy);
    
    避免在sql查询中使用“WHERE 1=1”
    SELECT*fromt
    不等于
    SELECT*fromt,其中1=1
    您可以看到在两个查询上运行“explain”

    String where = "";
    if (eBy != null && eBy != EBy.All) {
        where += ((where == "") ? " WHERE " : " AND ") + " SEARCH_BY = '" + eBy.name() + "'";
    }
    if (eStatus != null && eStatus != EStatus.All) {
        where += ((where == "") ? " WHERE " : " AND ") + " SEARCH_STATUS = '" + eStatus.name() + "'";
    }
    if (ePrivacy != null && ePrivacy != EPrivacy.All) {
        where += ((where == "") ? " WHERE " : " AND ") + " SEARCH_PRIVACY = '" + ePrivacy.name() + "'";
    }
    searchQuery += where;
    
    您正在使用JDBC吗?尝试对准备好的查询应用值,而不是将它们连接到查询字符串中。互联网上有很多关于这方面的资料,例如:

    首先确保“by”、“status”和“privacy”值与选择选项相等。这样编写的代码可能会成为SQL注入的牺牲品。有很多方法可以做到这一点。一个简单的例子是:

    public enum EBy {
        All, Users, Guests
    }
    public enum EStatus {
        All, Approved, Rejected
    }
    public enum EPrivacy {
        All, Public, Private
    }
    EBy eBy = EBy.valueOf(by);
    EStatus eStatus = EStatus.valueOf(status);
    EPrivacy ePrivacy = EPrivacy.valueOf(privacy);
    
    避免在sql查询中使用“WHERE 1=1”
    SELECT*fromt
    不等于
    SELECT*fromt,其中1=1
    您可以看到在两个查询上运行“explain”

    String where = "";
    if (eBy != null && eBy != EBy.All) {
        where += ((where == "") ? " WHERE " : " AND ") + " SEARCH_BY = '" + eBy.name() + "'";
    }
    if (eStatus != null && eStatus != EStatus.All) {
        where += ((where == "") ? " WHERE " : " AND ") + " SEARCH_STATUS = '" + eStatus.name() + "'";
    }
    if (ePrivacy != null && ePrivacy != EPrivacy.All) {
        where += ((where == "") ? " WHERE " : " AND ") + " SEARCH_PRIVACY = '" + ePrivacy.name() + "'";
    }
    searchQuery += where;
    

    您正在使用JDBC吗?尝试对准备好的查询应用值,而不是将它们连接到查询字符串中。互联网上有很多关于这方面的资料,例如:

    只是想确认它是否匹配一个整数和另一个整数,或者我需要创建一个名为“1”和值“1”的列。是的,它匹配一个整数和另一个整数,等于true=true或1>0等等。。不需要添加任何内容@Rupinderjeet47只想确认它是否将一个整数与另一个整数匹配,或者我需要创建一个名为“1”和值“1”的列。是的,它将一个整数与另一个intenger匹配,等于true=true或1>0等。。不需要添加任何内容@rupinderjeet47
    eBy
    eBy.name()
    之间有什么区别?此查询用于结果集。我认为用户不能在我的网站上编辑select标签的属性/值。我直接在查询中插入标记中的值。如果他们设法只改变select变量,就会出现注入。对吗?RE:
    eBy
    eBy.name()
    之间有什么区别,因为您使用
    enum
    对象来匹配
    eBy.All
    ,那么,为什么您不能在查询中输出它,为什么您需要使用
    eBy.name()
    ?1。用户可以编辑HTML发送到服务器的值。阅读更多关于SQL注入的信息。“some string”+eBy+“some string”等于“some string”+eBy.toString()+“some string”,这就是为什么我会优先选择eBy.name(),因为我不确定是否没有为该枚举预定义toString()方法。在一个大的应用程序中,依赖toString()方法不是一个好主意,因为有人可能会更改它,甚至不会警告您:)为什么一个带有“Where 1=1”的查询不等于另一个没有它的查询?在
    eBy
    eBy.name()
    之间有什么区别?此查询用于结果集。我认为用户不能在我的网站上编辑select标签的属性/值。我直接在查询中插入标记中的值。如果他们设法只改变select变量,就会出现注入。对吗?RE:
    eBy
    eBy.name()
    之间有什么区别,因为您使用
    enum
    对象来匹配
    eBy.All
    ,那么,为什么您不能在查询中输出它,为什么您需要使用
    eBy.name()
    ?1。用户可以编辑HTML发送到服务器的值。阅读更多关于SQL注入的信息。“some string”+eBy+“some string”等于“some string”+eBy.toString()+“some string”,这就是为什么我会优先选择eBy.name(),因为我不确定是否没有为该枚举预定义toString()方法。在大型应用程序中,依赖toString()方法不是一个好主意,因为有人可能会更改它,甚至不会警告您:)为什么带有“Where 1=1”的查询不等于没有它的另一个查询?