Python执行MySQL插入语句报错1054 (42S22):字段列表未知列'z'
错误原因
代码通过字符串直接拼接生成SQL语句,没有给varchar类型的插入值加单引号包裹,同时这种写法本身存在严重的SQL注入风险。
当输入用户名z、密码1时,拼接后实际执行的SQL为:
insert into signup values(z,1);
MySQL解析时会把没有单引号包裹的z判定为字段名,而非要插入的字符串内容,因此触发1054 (42S22): Unknown column 'z' in 'field list'报错。
修复方案
推荐使用参数化查询修复,这是mysql.connector官方支持的标准写法,会自动处理值的类型转义和引号包裹,同时彻底避免SQL注入问题。
将signup函数中的插入逻辑替换为以下内容即可:
def signup(): username=input('USERNAME:') password=input("PASSWORD:") # 使用%s作为参数占位符,禁止手动拼接用户输入到SQL语句中 insert_sql = "INSERT INTO signup (username, password) VALUES (%s, %s)" mycursor.execute(insert_sql, (username, password)) mydatabase.commit() print("\t\t\t****SIGNUP SUCESSFUL***") print("Now please login to continue.") login()
不推荐的临时测试修复方式:手动给拼接的字符串值加单引号,即把执行语句改成
mycursor.execute("insert into signup values('"+username+"','"+password+"');")。这种写法一旦用户输入的内容包含单引号就会直接触发SQL语法错误,还可能被恶意用户利用注入窃取、篡改数据库内容,仅可用于临时本地测试,绝对不能在正式环境使用。
内容的提问来源于stack exchange,提问作者aisha khan
相关产品推荐
相关产品推荐

