【问题标题】:JSP - How to write a valid search formJSP - 如何编写有效的搜索表单
【发布时间】:2018-04-27 21:18:45
【问题描述】:

我在 JSP 项目中的搜索表单有问题。特别是用户可以订阅一个事件,而管理员必须能够搜索该事件的所有成员。

我这样写一个表格:

out.println("<fieldset><legend>Search</legend><form action=\"cercaIscritti.jsp\" method=\"post\">"
            + "Name: <input name=\"name\" type=\"text\"><br>Surname: <input name=\"surname\" type=\"text\"><br>"
            + "Belonging: <input name=\"belonging\" type=\"text\"><br>Countr: <input name=\"country\" type=\"text\"><br>"
            + "<input type=\"submit\" value=\"Cerca\"></fieldset></form>");

(如果它不可读:有四个&lt;input&gt;,一个用于表中的每一列user,一个&lt;input&gt; 用于提交)。

我希望所有字段都是可选的,以便管理员可以填写所需的内容,但是如何构建查询?

我试过这样的:

public ResultSet searchSubs(String name, String surname, String belonging, String country) {
    try {
        boolean n = false, s = false, b = false, c = false;
        String query = "SELECT * FROM user WHERE ";
        if (!isEmpty(name)) {
            query += "firstName = ?";
            n = true;
        }
        if (!isEmpty(surname)) {
            if (n) {
                query += " AND lastName = ?";
            } else {
                query += "lastName = ?";
            }
            s = true;
        }
        if (!isEmpty(belonging)) {
            if (n || s) {
                query += " AND belonging = ?";
            } else {
                query += "belonging = ?";
            }
            b = true;
        }//and go on

但是如何使用PreparedStatement 添加值?这是正确的方法吗?如果不是,我该怎么做?

中间的布尔值仅用于测试,我想我会以某种方式使用它们,但我不知道如何。

【问题讨论】:

    标签: java mysql sql jdbc netbeans


    【解决方案1】:

    您可以按照以下方式搜索多个值:

    public ResultSet searchSubs(String name, String surname, String belonging, String country){
        try {
            String query = "SELECT * FROM user WHERE 1=1";
            //---------------------------------------^^^
            int index = 1;
            if (!name.isEmpty()) {
                query += " AND firstName = ?";
            }
            if (!surname.isEmpty()) {
                query += " AND surname = ?";
            }
            if (!belonging.isEmpty()) {
                query += " AND belonging = ?";
            }
    
            if (!country.isEmpty()) {
                query += " AND country = ?";
            }
    
            PreparedStatement ps = connection.prepareStatement(query);
    
            if (!name.isEmpty()) {
                ps.setString(index++, name);
            }
            if (!surname.isEmpty()) {
                ps.setString(index++, surname);
            }
            if (!belonging.isEmpty()) {
                ps.setString(index++, belonging);
            }
            if (!country.isEmpty()) {
                ps.setString(index++, country);
            }
    
            ResultSet rs = ps.executeQuery();
            //...
    

    这个想法很简单:

    • 在 Where 子句中使用 1=1 如果用户不输入任何值,则不会出现错误(在这种情况下,您的查询是 SELECT * FROM user WHERE 1=1,它将返回所有内容)
    • 第一部分是否用非空字段填充查询
    • 第二个 if 用正确的值填充准备好的语句。
    • 最后执行prepared statement,得到结果。

    【讨论】:

    • 首先,谢谢!这就是我要找的! 但是 IDE 会返回:“'where 子句'中的未知列 'surname'”。为什么? P.S.:我认为索引应该从 1 而不是 0 开始
    • 不客气@tuzzo,您是否检查了表格列的名称,您必须使用正确的名称,是的,索引应该从 1 开始,我在您发表评论前 9 分钟编辑它 :)
    • 你是对的。在数据库中,该列不是“姓氏”,而是“姓氏”。现在可以了,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    相关资源
    最近更新 更多