当我们在网页中使用where子句时如何输入?

时间:2009-02-20 05:57:08

标签: sql html database jsp

根据用户的输入,我想从数据库中选择记录。这是我的代码:

<%
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'

9 个答案:

答案 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+"'");