Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用SQL插入变量_Java_Sql_Derby - Fatal编程技术网

在Java中使用SQL插入变量

在Java中使用SQL插入变量,java,sql,derby,Java,Sql,Derby,我正在编写一个网页,它从表单中获取输入,通过cgi将其发送到java文件,通过sql将输入插入数据库,然后打印出数据库。不过,我在使用变量插入数据库时遇到了问题,我想知道是否有人能帮我解决这个问题 String a1Insert = (String)form.get("a1"); String a2Insert = (String)form.get("a2"); 这就是我从表单中获取变量的地方(只要相信它是有效的,还有很多后端,但我以前使用过它,我知道它正确地获取了变量) 这就是我试图插入数

我正在编写一个网页,它从表单中获取输入,通过cgi将其发送到java文件,通过sql将输入插入数据库,然后打印出数据库。不过,我在使用变量插入数据库时遇到了问题,我想知道是否有人能帮我解决这个问题

String a1Insert = (String)form.get("a1");
 String a2Insert = (String)form.get("a2");
这就是我从表单中获取变量的地方(只要相信它是有效的,还有很多后端,但我以前使用过它,我知道它正确地获取了变量)

这就是我试图插入数据库的地方。它给了我一个错误:

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.

如果有人有什么好主意^。^谢谢

java.sql.Statement
不支持参数,切换到将允许您设置参数。将SQL中的参数名称替换为
,并调用准备好的语句上的setter方法为每个参数赋值。这看起来像

String sql = "INSERT INTO MEMBER VALUES (?, ?)";
PreparedStatement stmt = con.prepareStatement(sql);
stmt.setString(1, "a1");
stmt.setString(2, "a2");
stmt.executeUpdate();
这将执行SQL

INSERT INTO MEMBER VALUES ('a1', 'a2')
请注意,参数索引从1开始,而不是从0开始。还请注意,我不必在字符串上加引号,PreparedStatement为我做了这件事

或者,您可以继续使用语句并在Java代码中创建SQL字符串,但这会引入SQL注入攻击的可能性。使用PreparedStatement设置参数可以通过为您处理报价来避免该问题;如果在参数值中找到引号,它将对其进行转义,这样它就不会影响包含在其中的SQL语句


Oracle在此处有一个很好的示例。

如果语法正确,在和处都有很好的信息--stmt.executeUpdate(“插入到成员值(“+a1Insert+”,“+a2Insert+”)”);--然后,它在技术上会起作用,但如果有人可以操纵a1Insert/s2Insert并将其设置为恶意值,则会使您面临SQL注入攻击。因此,您应该遵循Nathan提到的PreparedStatement方法。@NeilCoffey,除非正确的SQL在insert语句中指定了列名。所以需要。。。进入成员(colname1,colname2)值(value1,value2)@jwenting原则上,如果值匹配,您可以省去列名。@NeilCoffey,并且不会混淆您所暗示的列顺序。。。我已经让数据库给出了错误,在插入所有列顺序不明确的列(例如,一个表有两列,都是varchar)时忽略了这些错误。
INSERT INTO MEMBER VALUES ('a1', 'a2')