# Java SQL Insert escapen



## =fire= (20. Mai 2011)

Hallo,

ich suche die funktion für Java um die Strings vor dem Insert zu escapen, damit ich auch folgendes machen kann:

INSET INTO ... VALUES ('Peter's Bücher');

SELECT:

```
String query = "SELECT * FROM test WHERE buch='Peter's';
		try {
			// Setzt eine neues Statement, initaliesiert die MySQL Abfrage
	        Statement st = mysql.createStatement();
	        // Führ den Query String aus und speichert das Ergebnis
	        ResultSet rs = st.executeQuery(query);
	        // Gibt das Ergebnis zurück
	        return rs;
[..]
```
INSERT: 

```
Statement st = mysql.createStatement();
// Setzen des Query's für das einfügen
st.executeUpdate("INSERT test (buch) VALUES ('Peter's')");
			ResultSet rs = st.getGeneratedKeys(); 
			int insertedKeyValue = 0;
			if ( rs != null && rs.next() ) { 
				insertedKeyValue = rs.getInt(1); 
			}
			return insertedKeyValue;
```


----------



## SE (20. Mai 2011)

Warum willst du dir nen String bauen und dann da drin noch rumescapen ?
Mach es doch so wie es sich in Java gehört : mit Variablen


```
Statement.executeUpdate("INSERT INTO "+table+" VALUES ('"+value1+"', '"+value2+"')");
```

Dann hast du das Problem nicht denn Java baut dann den String so zusammen das es auch funktioniert. Außerdem bekommst du sonst via SQLException die genaue Fehlermeldung wo was nicht passt.


----------



## CPoly (20. Mai 2011)

Datenbankabfragen sollte man grundsätzlich gar nicht durch Konkatenation zusammenbauen. Besser sind prepared Statements.

http://de.wikipedia.org/wiki/Prepared_Statement
http://stackoverflow.com/questions/1812891/java-escape-string-to-prevent-sql-injection


----------



## SE (20. Mai 2011)

Stimmt schon das PreparedStatements besser und sinnvoller sind ... aber als einfache Lösung kann mans schon so machen wie ichs als Beispiel gepostet habe.


----------



## CPoly (20. Mai 2011)

Bei deiner Lösung fehlt aber doch immer noch die gesuchte escape-Funktion.


----------



## SE (21. Mai 2011)

Hmm ... das überlass ich dem JDBC-Driver ...
Hab ja gesagt : wenns immer noch nicht funktioniert sollte der Driver per SQLException schon den Fehler bemeckern ^^


----------



## genodeftest (23. Mai 2011)

PreparedStatements sind ein Muss, denn sie sind weniger anfällig für SQL-Injection. Wer im großen Maßstab ohne PreparedStatements arbeitet, handelt fahrlässig und verschenkt je nach DBMS eine Menge Rechenzeit.


----------



## Javacode (30. Mai 2011)

Hallo!
Wie oben schon erwähnt worden ist, sind hier variablen die beste Lösung.


```
String value = "Peter´s";
String stmt = "select * from <Table> where <Attribut>="+value;

//Bessere Lösung

PreparedStatement ps1 = null;
ResultSet rs1 = null;
String stmt = "selcect * from <Table> where <Attribut>=?";
ps1 = <Connection>.prepareStatement(stmt);
ps1.setString(1, "Peter´s"); //oder ps1.setString(1, value);
rs1 = ps1.executeQuery();
```


Grüße,
Javacode


----------

