繁体   English   中英

为什么SQL INSERT查询将输入的值用作列名

[英]Why SQL INSERT query takes the entered values as column names

我对SQL INSERT QUERY有问题。 每当我在以下代码中执行INSERT QUERY时,会发生什么情况,即查询会理解要作为列名输入的值。 我的代码是:

try
{
    Class.forName("com.mysql.jdbc.Driver");
    Connection con=DriverManager.getConnection("jdbc:mysql://localhost/db","root","123456");
    Statement s = con.createStatement();
    int start = 8, end = 10;
    char buf[] = new char[end-start];   // for extracting day alone.

    dvalue = new String();
    ddvalue = new String(); // for adding the extracted day to the table.
    dvalue = cb3.getSelectedItem().toString();
    dvalue.getChars(start, end, buf, 0);System.out.println(buf);
    ddvalue = String.copyValueOf(buf);


    s.executeUpdate("insert into "+nameoftab+" (sname,"+"_"+ddvalue+"_"+") values (hello,"+cb3.getSelectedItem()+")");
}
catch(SQLException s)
{
    System.out.println("SQL statemnet is not executed!");
    System.out.println(s);
}

执行查询后出现的错误是:-

SQL statemnet未执行! com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:“字段列表”中的未知列“ hello”

-编辑-实际上,我的代码是:

s.executeUpdate("insert into "+nameoftab+" (sname,"+""+ddvalue+""+") values ("+cb5.getSelectedItem()+","+cb3.getSelectedItem()+")"); 

当我像大家所说的那样插入引号时,会发生什么事,就是在表中输入了术语“ cb5.getSelectedItem()”。 “ + cb3.getSelectedItem()+”的情况是,它只是输入一些垃圾值。

您需要在查询中引用字符串hello

s.executeUpdate("insert into "+nameoftab+" (sname,"+"_"+ddvalue+"_"+") values ('hello',"+cb3.getSelectedItem()+")");

尝试用单引号引起来-例如“ hello”

尝试这个

  s.executeUpdate("insert into "+nameoftab+" (sname,"+"_"+ddvalue+"_"+") values ('hello',"+cb3.getSelectedItem()+")");

这是因为您需要在字符串中添加引号。 请尝试这样做:

>     s.executeUpdate("insert into "+nameoftab+" (sname,"+"_"+ddvalue+"_"+") values
> ('hello','"+cb3.getSelectedItem()+"')");

注意,我在要插入的字符串的开头和结尾添加了char '

为什么SQL认为您的字符串是一列? 想象一下您发送到sql的字符串是如何的:

"insert into OneTable (Field1, Field2) values (Hello, George)"
Instead of (the correct one):

“插入到OneTable(Field1,Field2)值('Hello','George')中”

您需要在hello周围插入引号,这是mysql得知值是整数或字符串的方式,
使用任一' '

 s.executeUpdate("insert into "+nameoftab+" (sname,"+"_"+ddvalue+"_"+") values ('hello',"+cb3.getSelectedItem()+")"); 

\\" \\"都起作用

 s.executeUpdate("insert into "+nameoftab+" (sname,"+"_"+ddvalue+"_"+") values (\"hello\","+cb3.getSelectedItem()+")");

您可能要考虑改用PreparedStatement ,以便不必处理此类引用问题-并且可以从SQL注入攻击中获得保护,这是附加的好处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM