MySQL登录系统故障:无法校验列表中的元组,求修复方案
登录系统校验失败的修复方案
问题根源
uploadData()函数中,mycursor.fetchall()会返回一个包含所有(用户名, 密码)元组的列表,但你使用bigdata.append(data)将这个列表作为单个元素添加到了bigdata中,导致bigdata变成嵌套结构(例如bigdata = [ [(u1,p1), (u2,p2)] ])。登录时你判断的是单个元组(user,passw)是否在bigdata里,自然无法匹配。
修复方案
方案1:修正数据加载逻辑(基于现有列表校验的方式)
将append()替换为extend(),把fetchall()返回的所有元组逐个添加到bigdata中,避免嵌套:
def uploadData(): print("Bezig met uploaden.") mycursor.execute("SELECT name, password FROM userData") data = mycursor.fetchall() # 用extend替代append,将data中的每个元组直接加入bigdata bigdata.extend(data) print("Upload worked. \n")
需确保bigdata在函数外已初始化(例如bigdata = [])。
方案2:直接赋值初始化(更简洁)
直接将bigdata赋值为fetchall()的结果,无需嵌套:
def uploadData(): print("Bezig met uploaden.") mycursor.execute("SELECT name, password FROM userData") global bigdata # 直接覆盖bigdata为查询结果的元组列表 bigdata = mycursor.fetchall() print("Upload worked. \n")
注意:必须添加global bigdata声明,否则会被当作函数内的局部变量处理。
方案3:直接查询数据库校验(推荐生产环境使用)
不需要将所有用户数据加载到内存,登录时直接查询数据库校验,更高效且避免内存占用问题:
def login(): userKnown = input("Hallo, heeft u al een account? y/n ") if userKnown == "y": user = input("username: ") passw = input("password: ") # 直接查询数据库匹配用户名和密码 mycursor.execute("SELECT * FROM userData WHERE name = %s AND password = %s", (user, passw)) # fetchone()如果找到匹配项则返回元组,否则返回None if mycursor.fetchone(): print("login succesful") else: print("try again")
内容的提问来源于stack exchange,提问作者Rens Vermeulen
相关产品推荐
相关产品推荐

