mysql语法错误代码?

时间:2013-12-25 08:33:08

标签: mysql database

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();

3 个答案:

答案 0 :(得分:1)

根据您的要求您必须将'添加到您提供的值中,就像您为列名称所做的那样。

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

如果您使用的是PHP,那么在变量之前可能需要 $

请记住,如果 tno 列是int类型,那么您可以使用'来引用值,但最好避免使用。

注意:它对SQL注入是开放的,所以我建议你转移到PDO或MySQLi。为了安全和性能。

在php 中,您可以为PDO预编译语句

编写此代码
$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();

其中20是字符串(varchar)的长度。

在Java 中,我看到你的编辑需要在java中做准备语句然后这里是正确的代码

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());
    }

答案 1 :(得分:1)

不要连接sql字符串(主要是 SQL注入。)。

由于您使用的是prepareStatement,因此请使用它:

// 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();

答案 2 :(得分:0)

您忘记使用单引号'引用您的值,并且您的字段名称应该 - 如果引用的话 - 对于MySQL应该用反引号引用,而不是单引号。

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

要使用PreparedStatement执行此操作(并猜测一下您的类型),代码将是这样的;

// Field names are optinally quoted using ` backticks for MySQL
sql = "INSERT INTO user_details (`fname`,`lname`,`cname`,`tno`,`uname`,`pwd`) " +
      "VALUES (?,?,?,?,?,?)";

// Set all parameters
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, fname);
stmt.setString(2, lname);
stmt.setString(3, cname);
stmt.setInt(4, tno);
stmt.setString(5, uname);
stmt.setString(6, pwd);

// executeUpdate also does inserts, not just updates
stmt.executeUpdate();
相关问题