2012-02-08 44 views
4

我目前有一個問題,選擇從MySQL數據庫中的某個項目。我的程序旨在將一個參數從android應用程序傳遞給一個servlet,然後servlet查詢數據庫。有一個mySQL錯誤,未知的列在哪裏從句

但是出現在控制檯窗口中的錯誤:在 未知列'0102310c24「where子句」

只有當我要選擇的值包含一個字母一個錯誤。

當我查詢這個號碼0106172459,我想要的數據返回沒有問題。

以下是我的servlet。

import java.io.*; 
import java.util.*; 
import javax.sql.*; 
import javax.servlet.*; 
import javax.servlet.http.*; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
public class DBServlet extends HttpServlet { 
public void service(HttpServletRequest request,HttpServletResponse response) 
throws IOException, ServletException{ 
response.setContentType("text/html"); 
PrintWriter out = response.getWriter(); 
String x=request.getParameter("item"); 
Connection con = null; 
Statement stmt = null; 
ResultSet rs = null; 
try { 
Class.forName("com.mysql.jdbc.Driver"); 
con =DriverManager.getConnection ("jdbc:mysql://IP/databasename", "username", "password"); 
stmt = con.createStatement(); 
rs = stmt.executeQuery("SELECT * FROM items WHERE item="+x); 
// displaying records 
while(rs.next()){ 
out.print(rs.getObject(1).toString()); 
out.print(","); 
out.print(rs.getObject(2).toString()); 
out.print(","); 
out.print(rs.getObject(3).toString()); 
out.print(","); 
out.print(rs.getObject(4).toString()); 
out.print(","); 
out.print(rs.getObject(5).toString()); 
out.print(","); 
out.print(rs.getObject(6).toString()); 
out.print(","); 
out.print(rs.getObject(7).toString()); 
out.print(","); 
out.print(rs.getObject(8).toString()); 
out.print(","); 
out.print("\n"); 
} 
} catch (SQLException e) { 
throw new ServletException("Servlet Could not display records.", e); 
} catch (ClassNotFoundException e) { 
throw new ServletException("JDBC Driver not found.", e); 
} finally { 
try { 
if(rs != null) { 
rs.close(); 
rs = null; 
} 
if(stmt != null) { 
stmt.close(); 
stmt = null; 
} 
if(con != null) { 
con.close(); 
con = null; 
} 
} catch (SQLException e) {} 
} 
out.close(); 
} 
} 

我用它將值發送給servlet。

List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(); 
nameValuePair.add(new BasicNameValuePair("item","List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(); 
nameValuePair.add(new BasicNameValuePair("item","010238a2cc"));")); 

我應該心存感激,如果有人可以幫助

回答

11

x應該用引號括起來,或者非數字值將被假定爲是指一列,而不是一個字符串。你的腳本似乎容易受到SQL注入,作爲值x

rs = stmt.executeQuery("SELECT * FROM items WHERE item='"+x + "'"); 

注意尚未逃脫但是從Request收到。在這裏使用準備好的陳述會更好。

+0

完美,知道這是非常小的事情。非常感謝您的幫助和建議。我還會研究你提供的關於使用預備聲明的其他建議。再次感謝。 – user1128488 2012-02-08 12:13:04

0

如果項目是字符串類型,那麼您需要用引號括起來。更好的是,您應該使用PreparedStatement來執行查詢。

2

嘗試使用PreparedStatement

PreparedStatement st = con.prepareStatement("SELECT * FROM items WHERE item=?"); 
st.setString(1,x); 
rs = st.executeQuery(); 
0

如果值x整數然後使用以下代碼: - RS = stmt.executeQuery( 「SELECT * FROM項WHERE項=」 + x)的; 如果值x是字符串,則使用以下代碼: - rs = stmt.executeQuery(「SELECT * FROM items WHERE item ='」+ x「'」);