2011-11-11 52 views
0
try { 
    Statement stmt = con.createStatement(); 
    stmt.executeUpdate("INSERT into emailacc(fname,lname,uname,mail,passwd,passwd2,date,month,year) values('"+fname+","+lname+","+uname+","+mail+","+passwd+","+passwd2+","+date+","+selectMonth+","+year+"')"); 
    out.println("<h3><font color='green'>Information Added Successfully.</font><br> You Are a registered User now.</h3><br>"); 
    con.close(); 
} catch(Exception e) { 
    out.println("Exception caught : "+e); 
} 

爲什麼會發生? 上次我做了同樣的事情,但沒有發生,它有什麼問題?java.sql.SQLException:列計數與第1行的值計數不匹配Servlets錯誤或Mysql錯誤?

回答

1

是因爲你省略了單引號,爲了避免這個錯誤,我的建議是使用Prera​​redStatement,也是爲了正確地關閉它,塊,你的代碼必須看看這個:

try { 
     PreparedStatement stmt = con.prepareStatement("INSERT into emailacc(fname,lname,uname,mail,passwd,passwd2,date,month,year) values(?,?,?,?,?,?,?,?,?)"); 
     stmt.setString(1,fname); 
     stmt.setString(2,lname); 
     stmt.setString(3,uname); 
     stmt.setString(4,mail); 
     stmt.setString(5,passwd); 
     stmt.setString(6,passwd2); 
     stmt.setDate(7,date); //you need convert your date to java.sql.Date if 'date' field of database is of type date. If not setString is fine 
     stmt.setInt(8,selectMonth); 
     stmt.setInt(9,year); 
     stmt.executeUpdate(); 
     out.println("<h3><font color='green'>Information Added Successfully.</font><br> You Are a registered User now.</h3><br>"); 
    } catch (Exception e) { 
     con.rollback(); 
     out.println("Exception caught : " + e); 
    } finally { 
     if (con != null) { 
      try { 
       con.close(); 
      } catch(SQLException ex){ 
       //DO NOTHING 
      } 
     } 
    } 

您可以瞭解更多PreparedStatemt的:

http://download.oracle.com/javase/tutorial/jdbc/basics/prepared.html

最後請注意:PreparedStament是比較有效吳丹聲明,避免SQL注入入侵所以PrepararedStatement更安全。嘗試使用始終PreparedStatement

+0

thanx大家! –

4

那麼到開始與什麼是錯誤的是,你是包括值直接到您的SQL。不要這樣做。永遠。通過PreparedStatement使用參數化的SQL語句,並適當地設置參數值。這樣,你不必擔心SQL injection attacks,它會很容易看看什麼是實際的,而不用擔心價值從哪裏來(或者說,分離這兩個關注點)。

我懷疑眼前的問題是,你不引用任何值,所以你有喜歡的一個更長的版本SQL語句:

INSERT into Foo(name) VALUES (jon) 

而不是

INSERT into Foo(name) VALUES ('jon') 

。 ..但使用參數化的SQL將解決這個問題,所以不只是改變SQL以包括單引號到處。

+0

問** 9分鐘前**,回答** 6分鐘前** - 你真的很快:) –

+1

@Downvoter:小心評論? –

+1

我只是不認爲你應該在這樣的原始問題中浪費自己。我不喜歡這個網站上的大多數聲譽因爲回答衆多原始問題而被記錄。 –

1

INSERT語句中是字符串插入語句之間缺少的報價應該是:

INSERT into emailacc(fname,lname,uname,mail,passwd,passwd2,date,month,year) values('"+fname+"','"+lname+"','"+uname+"','"+mail+"','"+passwd+"','"+passwd2+"',"+date+","+selectMonth+","+year+")"); 

每一列的varchar或文本應該是單引號之間還仔細檢查您的日期格式,你可能需要使用to_date函數: to_date(,'DD-MM-YYYY')只是一個樣本

+0

這是一個「固定」問題的「壞」方式。 OP *真正*應該使用參數化SQL。 –

+0

你是對的,它會更好,但我們都缺少設計缺陷。由於out.println('html code'),代碼似乎被寫入servlet。這顯然應該被提取到一個java類中進行預編譯,這將是一個更好的設計「全部通過」腳本並不意味着用java編碼 – Stainedart

+0

當然,這不是好的設計 - 但是我會寧可有一些設計不好,但根本安全的東西比*尖叫*安全漏洞這是你的答案仍然留下(沒有任何警告)。 –

相關問題