2017-04-04 2 views
0

du code JavaIndice de paramètre hors plage (1> nombre de paramètres, ce qui est 0), comment éviter?

J'ai essayé de mises à jour les valeurs des lignes sélectionnées, mais Im obtenir l'index des paramètres hors d'exception liée. Aucune suggestion? la déclaration est correcte, aussi quelqu'un peut-il expliquer pourquoi il se produit?

public class Editbook extends HttpServlet { 
    private static final long serialVersionUID = 1L; 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     PrintWriter out = response.getWriter(); 
     try { 
      String booktitle = request.getParameter("booktitle"); 
      String author = request.getParameter("author"); 
      String category = request.getParameter("category"); 
      String pages = request.getParameter("pages"); 
      String desc = request.getParameter("description"); 
      String isbn = request.getParameter("isbn"); 

      Connection con = Logincheck.getConnection(); 
      PreparedStatement ps = con.prepareStatement("update books set title ='"+booktitle+"', author ='"+author+"', category ='"+category+"', pages ='"+pages+"', description ='"+desc+"' where isbn ='"+isbn+"'"); 

      ps.setInt(1, Integer.parseInt(isbn)); 
      ps.setString(2, booktitle); 
      ps.setString(3, author); 
      ps.setString(4, category); 
      ps.setInt(5, Integer.parseInt(pages)); 
      ps.setString(6, desc); 

      int i = ps.executeUpdate(); 
      out.println("updated"); 
      System.out.println(i + "updated"); 
     } catch (Exception e) {System.out.println(e);} 

    } 

} 
+2

Vous mélangez concaténation et sql param. –

Répondre

2

Dans le PreparedStatement, vous mettez directement les valeurs des paramètres et ne pas utiliser de ?. Alors, quand vous écrivez

ps.setInt(1, Integer.parseInt(isbn)); 

Cette déclaration est de remplacer la première occurrence de ? avec la valeur spécifiée. Mais puisqu'il n'y a pas de ?, il donne l'exception de l'index de paramètre hors limite.

2

Si vous créez un PreparedStatement et lui fournissez vos paramètres, il doit être marqué en conséquence dans votre SQL. À l'heure actuelle, vous concaténéz un SQL complet et vous ne pouvez pas lui fournir de paramètres car il n'y a pas de paramètres à fournir. Au lieu de cela, chaque paramètre est marqué comme un? dans votre SQL.

Votre code devrait être quelque chose dans les lignes de (notez l'ordre des paramètres):

Connection con = Logincheck.getConnection(); 
PreparedStatement ps = con.prepareStatement("update books set title = ?, author = ?, category = ?, pages = ?, description = ? where isbn = ?"); 

ps.setString(1, booktitle); 
ps.setString(2, author); 
ps.setString(3, category); 
ps.setInt(4, Integer.parseInt(pages)); 
ps.setString(5, desc); 
ps.setInt(6, Integer.parseInt(isbn)); 

EDIT: Sur une autre note. Utiliser les paramètres comme je l'ai posté ici est beaucoup plus préférable que de concaténer une chaîne SQL complète car cela rendra votre code moins sujet à l'injection de code SQL.

-1

Le problème est que votre HttpServletRequest n'a aucun paramètre. Donc, vous ne pouvez pas y accéder ici

String booktitle = request.getParameter("booktitle"); 
      String author = request.getParameter("author"); 

Je recommande de vérifier si la demande contient des paramètres d'abord et d'y accéder alors:

if (request.getParameterMap().containsKey("booktitle")) { 
      String booktitle = request.getParameter("booktitle"); 
     } 

Et montrer comment vous construisez votre demande de poste.

+0

['getParameter()'] (http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getParameter (java.lang.String)) return 'null' si le paramètre n'existe pas. – Andreas