1064 (42000): 你的 SQL 语法有误;

1064 (42000): You have an error in your SQL syntax;

我正在使用 MYSQL 来存储用户名及其相应的加盐和散列密码,它不断给我这个错误。

1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'b[=11=]NwXT7hoHPBK.ywn/r5f3OWQKrF9o1/wUJt7u1eFtn3Se2XCmiXdm'')' at line 1

我的 Table 名字是 hassle_free_register 它 table 结构如下:

+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| USER_ID  | int          | NO   | PRI | NULL    | auto_increment |
| USERNAME | varchar(255) | NO   | UNI | NULL    |                |
| PASSWORD | varchar(255) | NO   |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+

存储密码的代码:

@app.route('/register' ,methods =['POST'])
def register():
   try:
      NAME = request.form['USER_NAME']
      PASSWORD = request.form['USER_PASSWORD']
      if(len(NAME)==0):
         raise ValueError("USERNAME CANNOT BE EMPTY")
      if(len(PASSWORD)<=8):
         raise ValueError("PASSWORD LENGTH TOO SHORT")
      if(len(PASSWORD)>=30):
         raise ValueError("PASSWORD LENGTH TOO LONG") 
      HASHEDPASS = bcrypt.hashpw(PASSWORD.encode('utf-8'),bcrypt.gensalt())    
      mycursor.execute("insert into Hassle_Free_Register(USERNAME,PASSWORD) values('{USER_NAME}','{USER_PASSWORD}');".format(USER_NAME = NAME,USER_PASSWORD = str(HASHEDPASS)))
      mydb.commit()
      return jsonify("REGISTERED SUCCESSFULLY") 
   except ValueError as error:
      return jsonify({"message":str(error)}),403
   except mysql.connector.Error as error:
      print(error)
      # return error
      return jsonify({"message":str(error)}), 404

请帮忙!我正在使用 Flask 框架。

HASHEDPASS 显然包含一个 ' 字符,它提前结束字符串 '{USER_PASSWORD}'

使用参数 cursor.execute() 而不是直接将变量代入 SQL 字符串。

mycursor.execute("insert into Hassle_Free_Register(USERNAME,PASSWORD) values(%s, %s);", (NAME, HASHEDPASS))

你看到问题了吗?您的散列密码包含单引号。那搞砸了你的报价。所以,让数据库连接器来做吧:

mycursor.execute("INSERT INTO HassleFree_Register(USERNAME,PASSWORD) VALUES(?,?);", (NAME, HASHEDPASS))

根据数据库的不同,您可能需要 %s 而不是 ?

作为文体注意事项,将全部大写用于变量名被认为不是好的形式。这对全局常量没问题,但变量应该是 usernameuser_name.