2016-04-14 52 views
0

Dize dizisini PreparedStatement öğesine iletiyorum. Ben mysql, jsp ve depolanmış prosedürler kullanıyorum, ama bu veritabanından veri alma değildir:Dize dizisini PreparedStatement'e geçiriyorum .. mysql, jsp ve saklı yordamı kullanıyorum

String searchbycategory[] = request.getParameterValues("category"); 

StringBuilder sb= new StringBuilder(); 
String filter = ""; 

for(int i = 0; i < searchbycategory.length; i++) { 
    sb.append("'"+searchbycategory[i]+"',"); 
} 

filter = sb.toString(); 
filter = filter.substring(0, filter.length()-1); 

PreparedStatement pstmt = con.prepareStatement("{call some(?)}"); 
pstmt.setString(1, filter); 

ResultSet resultset = pstmt.executeQuery(); 

cevap

0

searchbycategory uzunluğu 1 ise, beklendiği gibi programı çalışmalıdır. Sorun, giriş dizesini bire birleştirmektir.

programda SQL enjeksiyon önlemek istiyorsanız, PrepareStatement her searchbycategory gerektiği haritalama bir parametre. Örneğin:

String searchbycategory[] = request.getParameterValues("category"); 
    StringBuilder sb = new StringBuilder().append("select col_name from table_name where category in ("); 
    for (int i = 0; i < searchbycategory.length; i++) { 
     sb.append("?,"); 
    } 
    sb.setCharAt(sb.length()-1,')'); 
    PreparedStatement pstmt = con.prepareStatement(sb.toString()); 
    for (int i = 0; i < searchbycategory.length; i++) { 
     pstmt.setString(i+1, searchbycategory[i]); 
    } 
    ResultSet resultset = pstmt.executeQuery(); 
İlgili konular