代码的mysql语法错误?

代码的mysql语法错误?,mysql,database,Mysql,Database,根据您的要求,您必须在提供的值中输入”,就像您为列名所做的一样 sql = "INSERT INTO user_details ('fname','lname','cname','tno','uname','pwd') VALUES (" + fname + "," + lname +"," + cname +","+ tno + "," + uname + "," + pwd +")"; PreparedStatement stmt = conn.pr

根据您的要求,您必须在提供的值中输入,就像您为列名所做的一样

sql = "INSERT INTO user_details ('fname','lname','cname','tno','uname','pwd') VALUES (" +                    fname + "," + lname +"," + cname +","+ tno + "," + uname + "," + pwd +")";

PreparedStatement  stmt = conn.prepareStatement(sql);

stmt.executeUpdate();
如果您使用的是PHP,那么在变量之前可能需要$

请记住,如果tno列是int类型,则可以使用引用值,但最好避免

注意:它对SQL注入开放,因此我建议您转到PDO或MySQLi。为了安全和性能

在php中您可以为PDO准备的语句编写此代码

INSERT INTO user_details ('fname','lname','cname','tno','uname','pwd') VALUES ('" + fname + "','" + lname +"','" + cname +"','"+ tno + "','" + uname + "','" + pwd +"')";
其中20是字符串的长度(varchar)

在Java中,我看到了您的编辑,您需要用Java编写语句,下面是正确的代码

$pdoCon = new PDO('mysql:host=localhost;dbname=mydb', 'root', 'abc');
$stmt = $pdoCon->prepare("INSERT INTO user_details('fname','lname','cname','tno','uname','pwd') VALUES(?,?,?,?,?,?)");
$stmt->bindParam(1, $fname, PDO::PARAM_STR, 20);
$stmt->bindParam(2, $lname, PDO::PARAM_STR, 20);
$stmt->bindParam(3, $cname, PDO::PARAM_STR, 20);
$stmt->bindParam(4, $tno, PDO::PARAM_STR, 20);
$stmt->bindParam(5, $uname, PDO::PARAM_STR, 20);
$stmt->bindParam(6, $pwd, PDO::PARAM_STR, 20);
$stmt->execute();
不要压缩sql字符串(这主要是一个sql注入

由于您使用的是preparedStatement,请像以下那样使用它:

try
    {
      CreateConnection();
      CallableStatement calstat = conn.prepareCall("INSERT INTO user_details('fname','lname','cname','tno','uname','pwd') VALUES(?,?,?,?,?,?)");
      calstat.setString(1,fname);
      calstat.setString(2,lname);
      calstat.setString(3,cname);
      calstat.setString(4,tno);
      calstat.setString(5,uname);
      calstat.setString(6,pwd);
      calstat.executeUpdate();
      conn.close();
      calstat.close();
    }
    catch(Exception e)
    {
         JOptionPane.showMessageDialog(null, e.toString());
    }

您忘记了用单引号引用您的值,,,并且您的字段名(如果有引号的话)应该用反引号引用,而不是单引号

更好的是,不管怎样使用
PreparedStatement
时,您都希望使用参数化查询来避免SQL注入(例如,如果您的姓氏是
O'Connor
,只需在字符串中添加引号就可以中断SQL)。它通常还会提高查询的性能,因为数据库可以轻松地重用查询计划

要对PreparedStatement执行此操作(并稍微猜测一下您的类型),代码如下所示:

//字段名使用'backticks for MySQL'可选地引用
sql=“插入用户详细信息(`fname`、`lname`、`cname`、`tno`、`uname`、`pwd`)”+
“值(?,,,,,,,?)”;
//设置所有参数
PreparedStatement stmt=conn.prepareStatement(sql);
stmt.setString(1,fname);
stmt.setString(2,lname);
stmt.setString(3,cname);
stmt.setInt(4,tno);
标准设置管柱(5,uname);
stmt固定管柱(6,pwd);
//executeUpdate还进行插入,而不仅仅是更新
stmt.executeUpdate();

您可能想了解如何使用PreparedStatement参数,以避免SQL注入问题。错误发生的确切位置?字段名不应使用单引号引起来,但可以选择使用反勾号引起来。另外,PDO和MySQLi是针对PHP的,而不是针对Java:)用户没有特别针对Java进行标记,您可以看到针对单个QOUTE的mysql文档。参见示例
// column names don't need to be quoted.
sql = "INSERT INTO user_details(fname, lname, cname, tno, uname, pwd) VALUES (?,?,?,?,?,?)";
PreparedStatement  stmt = conn.prepareStatement(sql);
// then bind your params
stmt.bindParam(...
stmt.executeUpdate();