【发布时间】:2014-04-07 20:15:28
【问题描述】:
我正在编写一个网页,它从表单中获取输入,通过 cgi 将其发送到 java 文件,通过 sql 将输入插入数据库,然后打印出数据库。我在使用变量插入数据库时遇到了麻烦,我想知道是否有人可以帮助我。
String a1Insert = (String)form.get("a1");
String a2Insert = (String)form.get("a2");
这是我从表单中获取变量的地方(只要相信它有效,还有更多后端,但我以前使用过它,我知道它可以正确获取变量)。
String dbURL = "jdbc:derby://blah.blahblah.ca:CSE2014;user=blah;password=blarg";
Connection conn = DriverManager.getConnection(dbURL);
Statement stmt = conn.createStatement();
stmt.executeUpdate("set schema course");
stmt.executeUpdate("INSERT INTO MEMBER VALUES (a1Insert, a2Insert)");
stmt.close();
这是我尝试插入数据库的地方。它给了我错误:
Column 'A1INSERT' is either not in any table in the FROM list or appears within a join specification and is outside the scope of the join specification or appears in a HAVING clause and is not in the GROUP BY list. If this is a CREATE or ALTER TABLE statement then 'A1INSERT' is not a column in the target table.
如果有人有任何想法会很可爱^.^谢谢
【问题讨论】:
-
如果语法正确 -- stmt.executeUpdate("INSERT INTO MEMBER VALUES ('" + a1Insert + "', '" + a2Insert + "')"); -- 那么它在技术上会起作用,但是如果有人可以操纵 a1Insert/s2Insert 并将它们设置为恶意值,那么它会让你容易受到 SQL 注入攻击。因此,您应该遵循 Nathan 提到的带有 PreparedStatement 的方法。
-
@NeilCoffey 除了正确的 SQL 指定了插入语句中的列名。所以需要将...放入成员(colname1,colname2)值(value1,value2)
-
@jwenting 原则上,如果值匹配,您可以省略列名。
-
@NeilCoffey 并且对于您暗示的列顺序不会有任何混淆......我有数据库给出错误,在插入所有列顺序不明确的列时将它们排除在外(例如一个有 2列,都是 varchar)。