Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it L'avatar di Lomio
    Registrato dal
    Jul 2010
    Messaggi
    160

    [JSP] Decoder per DB mysql

    Ragazzi ho una pagina jsp che mi permette di inserire un articolo(titolo,testo) in DB, il problema è che se ci sono caratteri "strani" la query di insert fallisce.

    Esiste una classe con un metodo che converte in automatico la stringa passatagli in entrata in modo tale che non crei problemi?!
    Graciassss
    La legge e l'ordine saranno rispettati solo quando si concederà la giustizia a tutti indistintamente.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    No, non c'è nulla che effettui questa conversione meglio del driver stesso. Usa le PreparedStatement e non avrai di questi problemi.

    PS: non mescolare la logica di business con la presentation... le JSP dovrebbero servire solo ed esclusivamente per presentare i contenuti (Presentation); per la logica di business (interazioni con DB, implementazioni di sistemi di salvataggio, ecc) si usano le Servlet.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di Lomio
    Registrato dal
    Jul 2010
    Messaggi
    160
    Grazie mille per i consigli, però non so proprio cosa siano le PreparedStatement
    La legge e l'ordine saranno rispettati solo quando si concederà la giustizia a tutti indistintamente.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da Lomio
    Grazie mille per i consigli, però non so proprio cosa siano le PreparedStatement
    Beh, qui trovi la Documentazione di PreparedStatement.

    E' molto simile alle Statement e qui un esempio d'uso:

    codice:
    // Supponendo che la tabella preveda 3 campi stringa
    String sql = "INSERT INTO tabella VALUES(?,?,?)";
    PreparedStatement pstmt = connection.prepareStatement( sql );
    
    // Qui i valori stringa da inserire nella tabella
    String primoValore = " ... ";
    String secondoValore = " ... ";
    String terzoValore = " ... ";
    
    // Inserisco nella prepared statement (gli indici partono da 1!)
    // L'inserimento fa coincidere a ciascun placeholder (il punto di domanda) il valore corrispondente
    pstmt.setString(1, primoValore);
    pstmt.setString(2, primoValore);
    pstmt.setString(3, primoValore);
    
    // Eseguo l'inserimento
    if ( pstmt.execute() ) {
       // Tutto ok.
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it L'avatar di Lomio
    Registrato dal
    Jul 2010
    Messaggi
    160
    Grazie mille, però ancora niente...sapresti dirmi dove sbaglio?!?

    codice:
    	String titolo = "";
    	String testo = "";
    	String[] immagine = null;
    	String[] video = null;
    
    	if (request.getParameterValues("insert")[0] != null
    			&& request.getParameterValues("insert")[1] != null) {
    		titolo = request.getParameterValues("insert")[0];
    		testo = request.getParameterValues("insert")[1];
    
    		try {
    			immagine = request.getParameterValues("imm");
    		} catch (NullPointerException e) {
    			immagine[0] = "";
    		}
    		try {
    			video = request.getParameterValues("vid");
    		} catch (NullPointerException e) {
    			video = null;
    		}
    		if (video == null) {
    			video = new String[1];
    			video[0] = "";
    		}
    
    
    			Class.forName("com.mysql.jdbc.Driver");
    			Connection db = (com.mysql.jdbc.Connection) DriverManager
    					.getConnection("jdbc:mysql://localhost/mysql?user=root&password=rootpsw");
    
    		String query = "INSERT INTO articolo (titolo, testo, immagine, video) VALUES ('"
    				+ titolo
    				+ "',?,'"
    				+ immagine[0]
    				+ "','"
    				+ video[0]
    				+ "')";
    		PreparedStatement stmt = db.prepareStatement(query);
    		stmt.setString(1,testo);
    		ResultSet rst=stmt.executeQuery();
    	}
    La legge e l'ordine saranno rispettati solo quando si concederà la giustizia a tutti indistintamente.

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    A parte che il cast che hai fatto per ottenere la Connection è perfettamente inutile (parte in grassetto):

    codice:
    Connection db = (com.mysql.jdbc.Connection) DriverManager
                        .getConnection("jdbc:mysql://localhost/mysql?user=root&password=rootpsw");
    A parte il fatto che sarebbe più logico che la PreparedStatement fosse costruita in questo modo:

    codice:
    String query = "INSERT INTO articolo (titolo, testo, immagine, video) VALUES (?,?,?,?)";
    PreparedStatement stmt = db.prepareStatement(query);
    stmt.setString(1,titolo);
    stmt.setString(2,testo);
    stmt.setString(3,immagine[0]);
    stmt.setString(4,video[0]);
    Dovresti anche postare il trace dell'eccezione che viene sollevata, altrimenti è difficile capire quale possa essere il problema che, per inciso, potrebbe trovarsi da tutt'altra parte.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it L'avatar di Lomio
    Registrato dal
    Jul 2010
    Messaggi
    160
    Se non mettevo il cast midava un errore di Type Mismatch!!!

    Ho modificato come mi hai suggerito, ti posto l'errore:

    codice:
    org.apache.jasper.JasperException: An exception occurred processing JSP page /insArt.jsp at line 58
    
    55: 		stmt.setString(4,video[0]);
    56: 
    57: 
    58: 		ResultSet rst=stmt.executeQuery();
    59: 	}
    60: %>
    61: </body>
    
    
    Stacktrace:
    	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:511)
    	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:407)
    	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
    	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    root cause
    
    javax.servlet.ServletException: java.sql.SQLException: Can not issue data manipulation statements with executeQuery().
    	org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:898)
    	org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:827)
    	org.apache.jsp.insArt_jsp._jspService(insArt_jsp.java:125)
    	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:376)
    	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
    	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    root cause
    
    java.sql.SQLException: Can not issue data manipulation statements with executeQuery().
    	com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1056)
    	com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957)
    	com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
    	com.mysql.jdbc.StatementImpl.checkForDml(StatementImpl.java:413)
    	com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1797)
    	org.apache.jsp.insArt_jsp._jspService(insArt_jsp.java:114)
    	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:376)
    	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
    	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    La legge e l'ordine saranno rispettati solo quando si concederà la giustizia a tutti indistintamente.

  8. #8
    Utente di HTML.it L'avatar di Lomio
    Registrato dal
    Jul 2010
    Messaggi
    160
    Allora...l'errore l'ho risolto, era dovuto all'executeQuery() per una insert.
    L'ho sostituito con executeUpdate() e adesso non mi genera eccezioni...però i dati in db non vengono inseriti correttamente, i soliti problemi con i char accentati

    Non capisco il motivo, nelle pagine jsp ho inserito i seguenti tag

    codice:
    <%@ page language="java" contentType="text/html; charset=UTF-8" 	pageEncoding="UTF-8"%>
    nel table editor di MySql Administrator ho modificato il Character Set in "UTF-8 Unicode" e il Collation in "utf8_unicode_ci"
    La legge e l'ordine saranno rispettati solo quando si concederà la giustizia a tutti indistintamente.

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Ok, l'errore è mio. Nel codice d'esempio ho sbagliato: per le istruzioni SQL di aggiornamento non si usa "executeQuery()", ma "esecuteUpdate()".

    codice:
    if (pstmt.executeUpdate() >= 0) {
       // Tutto ok
    }

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Per il problema dell'encoding dei caratteri, dipende anche dal visualizzatore che usi per controllare i dati presenti nel DB.

    Se il visualizzatore non è in grado di decodificare correttamente il charset UTF-8, quello che verrà visualizzato non sarà "conforme" a ciò che ti aspetti.

    Fai una prova semplicissima:

    codice:
    import java.io.*;
    
    public class ScriviFile {
       public static void main(String[] args) {
          try {
             PrintStream ps = new PrintStream(new FileOutputStream("pippo.txt"), true, "UTF-8");
             ps.println("àèìòù");
             ps.close();
          } catch (Exception e) { e.printStackTrace(); }
       }
    }
    Questo programma genera un file chiamato "pippo.txt" utilizzando il charset UTF-8.
    Aprendolo con il Blocco Note di Windows vedrai correttamente i caratteri accentati... ma se provi ad aprirlo con un editor esadecimale, otterrai questo:

    codice:
    c3 a0 c3 a8 c3 ac c3 b2 c3 b9 0d 0a   | à èìòù
    Sostituendo il charset UTF-8 con ISO-8859-1, ricompilando e rieseguendo, vedrai correttamente i caratteri accentati con Blocco Note e nell'editor esadecimale quanto segue:

    codice:
    e0 e8 ec f2 f9 0d 0a   | àèìòù

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.