Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [JAVA] Prepared Statement e apostrofo

    Ciao a tutti!
    ho un problema con l'apostrofo, questo sconosciuto...
    in una applicazione web che sto sviluppando, devo gestire dei dati che l'utente inserisce tramite form in pagina jsp!
    Poi dovrò inserirli in un db MySQL!
    Il problema è sul controllo della validatà dei dati!
    dovendo successivamente far parte di una query SQL, ho il famoso problema dell'apostrofo!

    ho provato con 2 soluzioni:

    1) PreparedStatement
    in teoria aggiungono automaticamente l'escape all'apostrofo... e fin qui ok, lo fanno!
    ma ne mettono troppi però!!!

    questo è il codice:

    codice:
        private Connection conn;
        private PreparedStatement pst;
        private static int result;
    
    try {
                    pst=conn.prepareStatement("INSERT INTO ? (?) VALUES ?;");
                    pst.setString(1,tabella);
                    pst.setString(2,campi);
                    pst.setString(3,valori);
                    System.out.println(pst.toString());
                    result = pst.executeUpdate();
                    } catch (SQLException e) {
            System.out.println("Eccezione sql "+e.getMessage()+" Stato sql "+e.getSQLState()+" Codice di errore "+e.getErrorCode());
        }
    la sintassi è giusta, anche se non ho messo nomi del metodo ecc... non ho scritto tutto!

    i valori che passo sono esattamente questi:
    tabella = categorie
    campi = nome, descr
    valori = 'asd', 'asd'

    il preparedStatement diventa così:

    com.mysql.jdbc.PreparedStatement@13c5cc8: INSERT INTO 'categorie' ('nome, descr') VALUES '\'asd\', \'asd\'';

    ma non funziona! mi da questo errore:

    Eccezione sql You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''categorie' ('nome, descr') VALUES '\'asd\', \'asd\'' at line 1 Stato sql 42000 Codice di errore 1064

    ho provato tutte le combinazioni possibili, con e senza apostrofi nei campi, nella categoria, nei valori, ma niente! non mi funziona!

    2) Metodo di replace

    ho trovato questo metodo che funziona per cambiare qualche carattere in stringhe con altri:

    codice:
    public String controllo_input(String stringa) {
    
            stringa = replace(stringa,"<","&lt;");
            stringa = replace(stringa,">","&gt;");
            stringa = replace(stringa,"'","\'");
            stringa = replace(stringa,"\"","\\\"");
    
          return stringa;
        } 
        
        
        public static String replace(String source, String pattern, String replace)
        {
            if (source!=null)
            {
            final int len = pattern.length();
            StringBuffer sb = new StringBuffer();
            int found = -1;
            int start = 0;
    
            while( (found = source.indexOf(pattern, start) ) != -1) {
                sb.append(source.substring(start, found));
                sb.append(replace);
                start = found + len;
            }
    
            sb.append(source.substring(start));
    
            return sb.toString();
            }
            else return "";
        }
    ma purtroppo funziona solo con caratteri come < e > e non con l'apostrofo come interessa a me! se c'è l'apostrofo la stringa viene lasciata invariata (e quindi sbagliata)!

    AIUTOOOOO
    come posso fare?!

    scusate il messaggio luuuungo, ma sono disperato

    grazie a tutti

    ola
    "Quand'ero piccolo mia nonna mi portò a mangiare in una trattoria all'aperto. Cominciò a piovere. Ci misi 3 ore a finire il brodo."

    Mario Zucca

  2. #2
    il problema dovrebbe risiedere nel fatto che la query dovrebbe risultare cosi:

    INSERT INTO categorie (nome, descr) VALUES 'asd','asd';
    e non
    INSERT INTO 'categorie' ('nome, descr') VALUES ''asd', 'asd'';

    al momento non mi viene soluzione con il prepared statement...
    cmq dovrei averti dato una idea!!!

    per il replaceAll dai una lettura qui , vedi se ti può aiutare...

    comunque è normale che con l'apostrofo non ti cambi nulla!!!
    tu scrivi
    codice:
     stringa = replace(stringa,"'","'");
    con cosa dovresti modificare l'apostrofo?

    stex1984

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    56
    PreparedStatement non si usa come lo usi tu.

    Anzitutto, i nomi di campi o tabelle non possono essere parametri (quelli che poi setti con i metodi setString, setInt, ecc.).
    Inoltre, ogni singolo parametro deve essere rappresentato da un segnaposto (?) diverso.

    Dovresti fare:
    codice:
    pst=conn.prepareStatement("INSERT INTO categorie (nome, descr) VALUES ?, ?");
    pst.setString(1, "asd");
    pst.setString(2, "asd");
    System.out.println(pst.toString());

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.