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

Python SQLite登录系统cur.fetchone()[0]报NoneType错误如何解决

错误产生原因
  • 当输入的用户名在login_info表中不存在时,执行的查询语句没有匹配到任何记录,此时cur.fetchone()会返回None(空值)
  • 代码中直接对cur.fetchone()的结果取[0]下标,而None属于不支持下标访问的类型,因此直接抛出TypeError: 'NoneType' object is not subscriptable错误
  • 额外问题:原代码直接将用户输入的用户名拼接进SQL语句,存在严重的SQL注入风险,攻击者可以构造特殊用户名绕开登录验证,甚至篡改、删除数据库数据
修复方案
  1. 先判断cur.fetchone()的返回是否为空,再做后续取值逻辑
  2. 把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:09:02