java - 使用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/Collation latin1 / latin1_bin
解决方案
有两种方法可以使它工作:
推荐的解决方案:使用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();
战术解决方案:通过放置将输入显式转换为文本形式
''
。String sql = "select * from buyers where first_name='" + id + "'";
推荐阅读
- java - 字符串替换方法是否使用正则表达式?
- python - Pandas - 使用循环操作和组合多个数据帧
- python - 带有正则表达式的 Python For 循环
- sql - PostgreSQL:有没有办法将我的数据一块一块地插入到空表中以减少加载时间?
- c# - 在列表中获取响应。将 sql 更改为 Linq 查询以聚合数据
- google-apps-script - 嘿,如何在电子邮件中将值 [1] 设为粗体,如何更改文本的颜色?
- java - 由其他线程更新 javafx 上的 listview
- intellij-idea - 是否可以导出 Intellij 的上下文(Tools->Tasks&Contexts)
- scala - 使用 Spark 将数据帧写入 JSON 数组文件
- javascript - 将光标更改为图标或伪造拖动事件