2017-04-05 5 views
1

Ich habe eine einfache vorbereitete Anweisung, die die Datensätze in einer MySQL-Datenbank aktualisiert. Die Tabelle, die Spalte, das Zielattribut und die Informationen werden aus Textfeldern entnommen. Zuerst machte ich es ohne vorbereitete Aussage, aber das Programm war leicht breakable, wenn der Benutzer wählte, um Zitate oder %% $ &^* andere Symbole einzufügen.Mysql Syntaxfehler in vorbereiteter Anweisung

Jetzt bekommen Im dies:

UPDATE Client SET 'full_name' = Martinajh WHERE id = '5'com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Sie haben einen Fehler in Ihrer SQL Syntax; Sie in der Bedienungsanleitung für die richtige Syntax zu verwenden in der Nähe von '' selectedTable2' SET 'namec' = 'Cellvalue' WHERE id == 5' at line 1

String cellValue3 = String.valueOf(table.getValueAt(row, 0)); 
int id = Integer.parseInt(cellValue3); 
String selectedTable2 = (String) listOfTablesNames.getSelectedValue(); 
String cellValue = String.valueOf(table.getValueAt(row, column)); 
String namec = table.getColumnName(column); 
String query ="UPDATE ? SET ? = ? WHERE id== ?"; 
PreparedStatement preparedStmt = (PreparedStatement) conn.prepareStatement(query); 
preparedStmt.setString (1, "selectedTable2"); 
preparedStmt.setString(2, "namec"); 
preparedStmt.setString(3, "cellValue"); 
preparedStmt.setInt(4, id); 
preparedStmt.executeUpdate(); 
+2

'WHERE ID ==?' Versuchen Sie es mit einem einzelnen Gleichheitszeichen hier. –

Antwort

4

Sie auf Ihre MySQL-Server-Version entspricht kann keine vorbereitete Anweisung mit Tabellenname als Parameter erstellen. Sie müssen das SQL mit String-Verkettung/Platzhalter mit String.format konstruieren. Die vorbereitete Anweisung bezieht sich auf die Spaltenwerte, nicht auf den Tabellennamen. In Ihrem Fall:

String query ="UPDATE `" + selectedTableVar + "` SET `" + fieldNameVar + "` = ? WHERE id = ?"; 
//... 
preparedStmt.setString(1, "cellValue"); 
preparedStmt.setInt(2, id); 

Auch id = ? als @C. Helling erwähnt.

Wie zur Hygienisierung selectedTableVar und fieldNameVar Variablen, kann ich nicht einen Link jetzt, aber Sie können Sie sich über die Forschung tun, was ein gültiges Qualifikationsspiel in MySQL ... AFAIK, jedes UTF Zeichen gültig ist, die meisten Sonderzeichen können ein Teil eines gültigen Tabellennamens usw. sein. Unter Verwendung der oben vorgeschlagenen Syntax sollten Sie sich nicht erlauben, dass das Zeichen die Injektion verhindert, und ich schätze, das ist es. Aber es muss untersucht werden.

+0

Es ist generell eine gute Idee, die ID zu entschlüsseln, wenn es intern eine Methode dafür gibt. – tadman

+1

Es ist in der Tat. Aber ich kann mich momentan nicht erinnern, und ich kann es nicht schnell googlen. Also lass es @Boombastic Aufgabe sein :) –

+0

Vielen Dank, mein Herr, ich habe es geschafft, alles nach dem Lesen Ihrer Antwort zu lösen. – Boombastic

Verwandte Themen