Java 我的insert语句无效
我正在尝试向数据库中插入值,但如果有人能发现,代码似乎有问题。我使用Servlet获取用户输入,然后使用方法将输入发送到以下类:Java 我的insert语句无效,java,sqlite,servlets,Java,Sqlite,Servlets,我正在尝试向数据库中插入值,但如果有人能发现,代码似乎有问题。我使用Servlet获取用户输入,然后使用方法将输入发送到以下类: @Override public String createItem(String title, String info, String url, String imageFilename) { String addItem = title; Connection conn = null; try { Class.f
@Override
public String createItem(String title, String info, String url, String imageFilename) {
String addItem = title;
Connection conn = null;
try
{
Class.forName("org.sqlite.JDBC");
conn = DriverManager.getConnection("jdbc:sqlite:" + DBPath);
if (conn == null)
{
System.err.println("Database connection was null:(");
return addItem;
}
Statement stmt = conn.createStatement();
String query = "INSERT INTO items (title, info, URL, image) VALUES (newtitle, newInfo, newUrl, newImage )";
//String query = "INSERT INTO items (title, info, URL, image) VALUES(" + title + "," + info + "," + url +","+ imageFilename +")";
stmt.executeUpdate(query);
stmt.close();
}
catch(Exception e)
{
System.err.println("Exception querying database" + e.toString());
}
finally
{
try
{
conn.close();
}
catch(Exception e)
{
System.err.println("Exception querying database" + e.toString());
}
}
return addItem;
}
我尝试在不使用从servlet传递到方法中的值的情况下键入值。
我已经检查了Sqlite管理器中的insert语句及其工作情况,我还检查了值是否已发送到上述类,它是否工作,并且我已经尝试了连接,因此它使我能够从中检索数据,但不能插入到其中。因此,我不知道它为什么不在数据库中存储值。此插入肯定不起作用:
String query = "INSERT INTO items (title, info, URL, image) VALUES (newtitle, newInfo, newUrl, newImage )";
即使要将它们存储为字符串文字,也必须在SQL语句中使用单引号,如下所示:
String query = "INSERT INTO items (title, info, URL, image) VALUES ('newtitle', 'newInfo', 'newUrl', 'newImage' )";
PreparedStatement stmt = conn.prepareStatement(
"INSERT INTO items (title, info, URL, image) VALUES (?, ?, ?, ?)"
);
stmt.setString(1, newtitle);
stmt.setString(2, newInfo);
stmt.setString(3, newUrl);
stmt.setString(4, newtitle);
stmt.executeUpdate();
要存储实际值,而不是我猜您想要的变量名,请使用以下PreparedStatement:
String query = "INSERT INTO items (title, info, URL, image) VALUES ('newtitle', 'newInfo', 'newUrl', 'newImage' )";
PreparedStatement stmt = conn.prepareStatement(
"INSERT INTO items (title, info, URL, image) VALUES (?, ?, ?, ?)"
);
stmt.setString(1, newtitle);
stmt.setString(2, newInfo);
stmt.setString(3, newUrl);
stmt.setString(4, newtitle);
stmt.executeUpdate();
这样做可以防止SQL注入攻击。什么确切的症状使您得出结论,代码似乎有问题?1-我已尝试用其他方法连接到数据库,但在使用SELECT语句时,它工作正常,可以从中检索数据。2-我检查我在方法中传递的变量是否正常工作,正如您所看到的,我正在将一部分值返回servlet,并且它显示字符串addItem=title;。但你还没有描述任何症状。它不起作用不是症状,而是抱怨。我无法将数据存储到数据库这应该做什么:Class.forNameorg.sqlite.JDBC;?我想这会管用的。仅当值不是单个标记时才需要使用引号。我是否要更改?到变量名???或者只有我们在setString中有变量名。不要更改问号,保持原样。setString会处理剩下的部分。非常感谢它的工作,但是我提供的代码是否能让它工作?我不太清楚你为什么要用你原来的方式来做。更重要的是,这种方式可以防止SQL注入。如果你不熟悉的话,请立即阅读。