Python向SQLite3插入数据为空及注册验证失败问题求助
问题分析与修复方案
核心问题:cursor.fetchall() 不适合判断INSERT操作结果
INSERT语句执行后不会返回任何结果集,cursor.fetchall()会直接返回空列表,导致你的if条件永远不成立——这就是为什么成功提示永远不触发、commit也没执行的根本原因。
分步修复:
1. 替换判断逻辑,用rowcount验证插入结果
执行INSERT后,通过cursor.rowcount获取受影响的行数,只要行数大于0,就说明数据插入成功:
def action_register(self): name = self.name.get() psword = self.password.get() conn = sql.connect("database.db") cursor = conn.cursor() # 改用参数化查询(安全且避免引号问题) cursor.execute("INSERT INTO usuarios (NOMBRE,PASS) VALUES (?, ?)", (name, psword)) if cursor.rowcount > 0: conn.commit() self.message = Label(self.vent, text='¡Registered succefully!', font=('calibri', 14),fg='Green').place(x=55, y=140) else: self.message2 = Label(self.vent, text='¡Error Register!', font=('calibri', 13), fg='Red').place(x=60, y=140) conn.close()
2. 必须用参数化查询替代字符串拼接
原代码直接把用户输入拼进SQL语句,不仅容易因为输入含引号导致语法错误,还存在SQL注入的严重安全风险。参数化查询能同时解决这两个问题,写法就是上面代码里的(?, ?)占位符+参数元组。
3. 优化Entry组件初始化(可选但推荐)
原代码中Entry(...).place()会把place()的返回值(None)赋值给self.username_input,如果之后需要操作输入框(比如清空内容)会报错,建议拆分写法:
self.name = StringVar() self.password = StringVar() self.username_input = Entry(self.vent, textvariable=self.name) self.username_input.place(x=70, y=69) self.password_input = Entry(self.vent, textvariable=self.password) self.password_input.place(x=90, y=104)
4. 加异常处理提升健壮性(可选)
可以给数据库操作加try-except块,捕获连接、执行时的错误,避免程序崩溃:
def action_register(self): name = self.name.get() psword = self.password.get() try: conn = sql.connect("database.db") cursor = conn.cursor() cursor.execute("INSERT INTO usuarios (NOMBRE,PASS) VALUES (?, ?)", (name, psword)) if cursor.rowcount > 0: conn.commit() # 清除之前的错误提示 if hasattr(self, 'message2'): self.message2.destroy() self.message = Label(self.vent, text='¡Registered succefully!', font=('calibri', 14),fg='Green').place(x=55, y=140) else: if hasattr(self, 'message'): self.message.destroy() self.message2 = Label(self.vent, text='¡Error Register!', font=('calibri', 13), fg='Red').place(x=60, y=140) except Exception as e: print(f"数据库错误: {e}") if hasattr(self, 'message'): self.message.destroy() self.message2 = Label(self.vent, text='¡Database Error!', font=('calibri', 13), fg='Red').place(x=60, y=140) finally: conn.close()
内容的提问来源于stack exchange,提问作者José González
相关产品推荐
相关产品推荐

