我对MySQL代码有问题。我认为问题是“字符串文件名”,我需要在SQL中引用它。
String query = "insert into warenliste (Artikel_ID, Artikelname, Anzahl, Hochfrequent) values ("+arikel_ID+", "+artikelname+", "+anzahl+", "+hochfrequent+")"
正常的SQL命令说:插入warenliste(Artikel_ID, Artikelname,Anzahl,Hoch频繁)值(123,"name",5,0);
-
完整代码:
public void setWareHinzu(int arikel_ID, String artikelname, int anzahl, boolean hochfrequent) {
try {
String query = "insert into warenliste (Artikel_ID, Artikelname, Anzahl, Hochfrequent) values ("+arikel_ID+", "+artikelname+", "+anzahl+", "+hochfrequent+")";
st.executeUpdate(query);
}
catch(Exception e) {
System.out.println(e);
}
}
你不能在SQL查询中包含这样的输入。想象一下,发送的文件名是字符串,不管是什么;DROP DATABASE warenliste CASCADE;--
。
如果您要运行您的代码…您的数据库将被擦除。
无法正确逃逸。解决方案在于准备语句
:
try (PreparedStatement ps = connection.prepareStatement("INSERT INTO warenliste (Artikel_ID, etc) VALUES (?, ?)")) {
// Note the question marks above: They mark where the variables go. Do not quote them.
ps.setInt(1, artikel_ID);
ps.setString(2, artikelname);
... the other vars go here.
ps.executeUpdate();
}
此外,在javaweWriteVariableNamesLikeThis中,not_like_this,它是“artikel”而不是arikel,异常包含至少4个有趣的信息位,仅使用e. printStackTrace()
,您将[A]丢弃4个有趣位中的3个,并且[B]随着代码继续运行,您将获得一系列错误。解决此问题的正确方法是声明您的方法throws SQLException
。请注意,您的公共静态void main
可以(并且应该!)被声明为throws Exception
。