IF条件不成立时Else语句未执行问题及代码修改方案咨询
解决JSP中OTP验证后邮箱匹配提示不执行的问题
问题根源
你写的SQL查询语句select * from empinfo where EEMailID='"+eemail+"'已经限定了只返回邮箱等于eemail的记录,所以ResultSet里的每条记录的EEMailID必然和你从session里取的eemail相等,while循环里的else分支永远不会触发。如果这个邮箱压根没在empinfo表中注册,rs.next()会直接返回false,循环都进不去,自然看不到"Enter Registered Email Id only"的提示。
修改方案
- 先判断查询结果是否存在记录,不存在直接输出错误提示
- 去掉循环内多余的邮箱相等判断(因为查询条件已经保证了匹配)
- 把Statement换成PreparedStatement,避免SQL注入风险
修改后的代码
<% try { String enteredOtp = request.getParameter("otps"); String actualOtp = (String) session.getAttribute("OTP"); if (enteredOtp.equals(actualOtp)) { String eemail = (String)session.getAttribute("eemail"); Connection con; Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql","root","12345"); // 用PreparedStatement避免SQL注入 String sql = "select EUsername from empinfo where EEMailID=?"; PreparedStatement pstm = con.prepareStatement(sql); pstm.setString(1, eemail); ResultSet rs = pstm.executeQuery(); if(rs.next()){ // 有匹配记录,显示修改密码链接 String uid = rs.getString("EUsername"); %> <a href="ChangePassword.jsp?uid=<%=uid%>">Change Password</a> <% } else { // 无匹配记录,输出提示 out.println("Enter Registered Email Id only"); } // 关闭资源避免连接泄漏 rs.close(); pstm.close(); con.close(); } else { out.println("WRONG OTP ENTERED"); } } catch(Exception e){ out.println(e); } %>
额外说明
- 新增了数据库资源关闭操作,避免长期占用连接导致泄漏
- 使用PreparedStatement不仅能防止SQL注入,还能避免邮箱含特殊字符(如单引号)时的SQL语法错误
内容的提问来源于stack exchange,提问作者Diana
相关产品推荐
相关产品推荐

