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,"<","<");
stringa = replace(stringa,">",">");
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