我的插入语句不起作用

时间:2013-12-07 19:54:19

标签: java sqlite servlets

我正在尝试向数据库插入值,但是如果有人能够发现它,那么代码似乎存在问题。我正在使用Servlet来获取用户输入,然后使用以下方法将输入发送到以下类:

@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语句及其工作,我还检查了值是否已发送到上面的类并且它正在工作并且我已经尝试了连接,因此它使我能够从中检索数据但不插入到它。所以我不知道为什么它没有将值存储在数据库中。

1 个答案:

答案 0 :(得分:0)

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

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注入攻击。