2017-04-05 38 views
1

我有一個簡單的準備語句來更新MySQL數據庫中的記錄。表格,列,目標屬性和信息都來自文本字段。首先,我沒有準備好聲明,但是如果用戶選擇插入引號或其他符號,程序很容易破壞。準備語句中的Mysql語法錯誤

現在即時得到這樣的:

更新客戶端設置 'FULL_NAME'= Martinajh WHERE ID ='5'com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:你 在你的SQL錯誤句法;檢查對應於 你的MySQL服務器版本正確的語法近 'selectedTable2' SET 'namec'= 'cellValue' WHERE ID = = 5' 在行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 ==?'嘗試在這裏使用一個等號。 –

回答

4

你可以用手動不能以表格名稱作爲參數來構建預備陳述。您需要使用String.format字符串連接/佔位符構造SQL。 Prepared語句是爲列值而不是表名。 你的情況:

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

此外,作爲id = ? @C。提到了Helling。

至於清理selectedTableVarfieldNameVar變量,我現在找不到鏈接,但您可以自己做關於MySQL中有效限定符的研究... AFAIK,任何UTF字符都是有效的,大多數的特殊符號可能是有效的表名稱的一部分等。使用上面提到的語法,你應該打擾不允許`字符來防止注入,我想就是這樣。但它必須進行調查。

+0

如果在內部有一種方法,那麼標識符通常是一個好主意。 – tadman

+1

確實如此。但我現在不記得一個,而且我也很快無法谷歌。所以讓它成爲@Boombastic任務:) –

+0

謝謝先生,我在閱讀你的答案後成功解決了所有問題。 – Boombastic