MySQL用户登录系统无法插入数据:字符串格式化错误求助
问题解决:MySQL插入用户数据失败的错误修复
错误原因
你碰到的not all arguments converted during string formatting错误,核心问题是INSERT语句的参数占位符用错了:
pymysql执行参数化查询时,需要用%s作为占位符,而你用了字符串格式化的{},导致数据库驱动无法正确解析传入的参数。
修复步骤
1. 修正INSERT语句写法
把insert函数里的SQL语句改成下面这样:
komutekle = """INSERT INTO USERS(name, lastname, username, password) VALUES (%s, %s, %s, %s)"""
这里的%s是pymysql标准的参数占位符,既能自动处理字符串转义、避免SQL注入,还能精准匹配你传入的data元组里的4个参数。
2. 修正逻辑错误
你代码里把if secim == "3": break放在了secim == "2"的代码块里,这会导致只有选择选项2并完成注册后,才会判断是否退出。正确做法是把这个判断移到外层主循环中,示例:
# 假设你的主循环结构是这样 while True: secim = input("请选择操作:1=登录,2=注册,3=退出") if secim == "2": # 你的注册输入逻辑 name = input("adınız") lastname = input("soyadınız:") username = input("kullanıcı adınız:") password = input("Şifreniz:") search = search_username(username) if search != None: print("bu kullanıcı adı ile zaten hesap var") continue insert(name, lastname, username, password) print("kayıt başarılı") elif secim == "3": break # 其他选项的处理逻辑...
3. 额外建议:密码安全
别直接存储明文密码,建议用bcrypt或passlib库对密码哈希后再存入数据库,示例:
# 先安装bcrypt:pip install bcrypt import bcrypt # 注册时哈希密码 password_input = input("Şifreniz:").encode('utf-8') hashed_pw = bcrypt.hashpw(password_input, bcrypt.gensalt()) # 插入数据库时存哈希后的字符串 insert(name, lastname, username, hashed_pw.decode('utf-8')) # 登录时验证密码 def check_password(input_pw, stored_pw): return bcrypt.checkpw(input_pw.encode('utf-8'), stored_pw.encode('utf-8'))
完整修正后的insert函数
def insert(name, lastname, username, password): baglanti = pymysql.connect(host='host', user='user', password='password', db='db', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor) try: cursor = baglanti.cursor() komutekle = """INSERT INTO USERS(name, lastname, username, password) VALUES (%s, %s, %s, %s)""" data = (name, lastname, username, password) cursor.execute(komutekle, data) baglanti.commit() finally: baglanti.close()
这里加了try...finally,确保不管是否出错,数据库连接都会被关闭,避免资源浪费。
内容的提问来源于stack exchange,提问作者Hasan Cenk Deniz
相关产品推荐
相关产品推荐

