Python SQLite登录系统cur.fetchone()[0]报NoneType错误如何解决
错误产生原因
- 当输入的用户名在
login_info表中不存在时,执行的查询语句没有匹配到任何记录,此时cur.fetchone()会返回None(空值) - 代码中直接对
cur.fetchone()的结果取[0]下标,而None属于不支持下标访问的类型,因此直接抛出TypeError: 'NoneType' object is not subscriptable错误 - 额外问题:原代码直接将用户输入的用户名拼接进SQL语句,存在严重的SQL注入风险,攻击者可以构造特殊用户名绕开登录验证,甚至篡改、删除数据库数据
修复方案
- 先判断
cur.fetchone()的返回是否为空,再做后续取值逻辑 - 把SQL字符串拼接改为参数化查询,避免SQL注入风险
修复后的完整代码如下:
def loginfunction(self): user = self.emailfield.text() password = self.passwordfield.text() if len(user)==0 or len(password)==0: self.error.setText("Please input all fields.") else: conn = sqlite3.connect("shop_data.db") cur = conn.cursor() # 使用参数化查询替代字符串拼接 query = 'SELECT password FROM login_info WHERE username = ?' cur.execute(query, (user,)) # 先接收查询结果,非空再取值 query_res = cur.fetchone() if not query_res: # 用户名不存在的情况 self.error.setText("Invalid username or password") else: result_pass = query_res[0] if result_pass == password: print("Successfully logged in.") self.error.setText("") else: self.error.setText("Invalid username or password")
内容的提问来源于stack exchange,提问作者Bobby
相关产品推荐
相关产品推荐

