You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 21:46:06