首页 > 解决方案 > 使用Mysql的JSP搜索功能不起作用

问题描述

我想在我的项目上创建搜索选项。当我通过 id 或 phone_number(在我的示例中名为br_telefona )搜索我的记录时它可以工作,但是当我按名字或姓氏搜索时它不会工作。

此外,phone_number 在数据库设置中设置为 varchar,与名字和姓氏相同。

这是我的搜索代码:

<%
                    Connection connection = null;
                    Statement statement = null;
                    ResultSet resultSet = null;
                    String id = request.getParameter("q");
                    try {
                        connection = DriverManager.getConnection(connectionUrl + database, userid, password);
                        statement = connection.createStatement();
                        String sql = "select * from buyers where first_name=" + id;
                        resultSet = statement.executeQuery(sql);
                        while (resultSet.next()) {
                %>
                <tr>
                    <td><%=resultSet.getString("first_name")%></td>
                    <td><%=resultSet.getString("last_name")%></td>
                    <td><%=resultSet.getString("email")%></td>
                    <td><%=resultSet.getString("phone_number")%></td>
                </tr>
                <%
                        }
                        connection.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                %>

上面的代码不起作用,但是在我通过 phone_number 查询的代码之后工作得很好

<%
                    Connection connection = null;
                    Statement statement = null;
                    ResultSet resultSet = null;
                    String id = request.getParameter("q");
                    try {
                        connection = DriverManager.getConnection(connectionUrl + database, userid, password);
                        statement = connection.createStatement();
                        String sql = "select * from buyers where phone_number=" + id;
                        resultSet = statement.executeQuery(sql);
                        while (resultSet.next()) {
                %>
                <tr>
                    <td><%=resultSet.getString("first_name")%></td>
                    <td><%=resultSet.getString("last_name")%></td>
                    <td><%=resultSet.getString("email")%></td>
                    <td><%=resultSet.getString("phone_number")%></td>
                </tr>
                <%
                        }
                        connection.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                %>

我还将名字从“约翰”更改为 987654 并做了

"select * from buyers where first_name=" + id;

它正在工作。

出于某种原因 request.getParameter("q"); 仅在输入整数时有效,但不适用于 varchar。

数据库引擎是 InnoDB,Charset/Collat​​ion latin1 / latin1_bin

标签: javamysqljsp

解决方案


有两种方法可以使它工作:

  1. 推荐的解决方案:使用PreparedStatement而不是Statement. 这将在两个突出的方面帮助您: (a) 它将保护您的应用程序免受SQL 注入。(b) 您不必将输入显式地转换为文本形式''

    String sql = "SELECT * FROM buyers WHERE first_name=?";
    PreparedStatement pstmt = connection.prepareStatement(sql);
    pstmt.setString(1, id);
    resultSet = pstm.executeQuery();
    
  2. 战术解决方案:通过放置将输入显式转换为文本形式''

    String sql = "select * from buyers where first_name='" + id + "'";
    

推荐阅读