根据用户的输入,我想从数据库中选择记录。这是我的代码:
<%
String jempid=request.getParameter("empid");
out.println(jempid);
int intempid=1223;
Connection conn=null;
String url="jdbc:mysql://localhost/employees";
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn=DriverManager.getConnection(url,"root","");
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery("select * from empdetails where empnum=jempid");
%>
它会抛出以下错误
javax.servlet.ServletException:java.sql.SQLException:'where子句中的未知列'jempid'
答案 0 :(得分:5)
使用字符串连接构造SQL是一个坏主意 - 您只是打开SQL注入攻击 - 特别是考虑到您直接从请求获得“empid”的值。糟糕!
更好的方法是使用参数化查询,如下所示:
PreparedStatement st=conn.prepareStatement("select * from empdetails where empnum=?");
st.setString(1, jempid);
ResultSet rs=st.executeQuery();
另外你应该检查jempid是否为空。
答案 1 :(得分:3)
这是你的选择陈述:
select * from empdetails where empnum=jempid
jempid是硬编码而不是用作变量。除非您将其更改为客户输入的变量值,否则这将永远不会有效。
改为:
"select * from empdetails where empnum=" + CleanseUserInput(jempid)
你很高兴。
答案 2 :(得分:1)
看起来jsp页面中的代码太多了.... 那说:
... empnum='"+jempid+"');" ......
而且当你完成后一定要关闭数据库
答案 3 :(得分:1)
是的,有时会抛出未知列的错误,例如我们有桌子自行车
所以我们假设我们有一个像 select * from bikes的查询,其中bikename = hayabusa;
如果您点击此查询而不是像未知列那样抛出错误,那么您应该注意的最好的事情是引用您的值,如果您在 where 子句中给出,那么正确的方法就像从bikes中选择* bikename =&#39; hayabusa&#39;;
答案 4 :(得分:0)
试试这个:
ResultSet rs=st.executeQuery(
"select * from empdetails where empnum=" + jempid);
您需要将jempid的值放入字符串,而不是文本“jempid”。
答案 5 :(得分:0)
ResultSet
rs=st.executeQuery("select * from empdetails where empnum=" + jempid + ";")
答案 6 :(得分:0)
"select * from empdetails where empnum="+jempid
但是你真的想保护它免受SQL注入!
答案 7 :(得分:0)
与其他回复相比,为什么不使用PreparedStatement?
基本上,你必须这样编码:
PreparedStatement st=conn.prepareStatement("select * from empdetails where empnum=?");
st.setString(1, jempId);
ResultSet rs=st.executeQuery();
您应该使用PreparedStatements的原因是SQL Injection个问题。例如,使用您在问题中发布的代码,黑客可以始终在选择jempid的文本框中键入“1; delete * from empdetails”。
因此形成的最终查询将是
select * from empdetails where empnum=1;delete * from empdetails
会导致empdetails中的所有数据被删除。
所以总是使用PreparedStatements !!
答案 8 :(得分:0)
where
应该在" "
内输入。像这样:
"select * from empdetails where empnum = "jempid";
因此这应该有效:
ResultSet rs = st.executeQuery("select * from empdetails where empnum=" +"'"+ jempid+"'");