有客自远方来52 2024-04-18 17:06 采纳率: 15.3%
浏览 2
已结题

为什么没有插入到数据库表中?(语言-python|开发工具-pycharm)

以下是我的相关代码,注册页面显示注册成功,但为什么没有插入到数据库表中?

class Tea:
    # 编号
    TID = None
    # 姓名
    Tname = None
    # 年龄
    Tage = None
    # 性别
    Tsex = None
    # 联系电话
    Tphone = None
    # 住址
    Taddress = None
    # 用户名
    Tuser = None
    # 密码
    Tpassword = None

    def __init__(self, TID, Tname, Tage, Tsex, Tphone, Taddress, Tuser, Tpassword):
        self.TID = TID
        self.Tname = Tname
        self.Tage = Tage
        self.Tsex = Tsex
        self.Tphone = Tphone
        self.Taddress = Taddress
        self.Tuser = Tuser
        self.Tpassword = Tpassword

    @staticmethod
    def my_construtor(TID, Tname, Tage, Tsex, Tphone, Taddress, Tuser, Tpassword):
        obj = Tea(TID, Tname, Tage, Tsex, Tphone, Taddress, Tuser, Tpassword)
        obj.TID = TID
        obj.Tname = Tname
        obj.Tage = Tage
        obj.Tsex = Tsex
        obj.Tphone = Tphone
        obj.Taddress = Taddress
        obj.Tuser = Tuser
        obj.Tpassword = Tpassword
        return obj


def add(tea: Tea):
    con = None
    try:
        con = dbUtil.getCon()
        cursor = con.cursor()
        # 判断用户名是否重复
        check_sql = f"SELECT Tuser FROM Teacher WHERE Tuser='{tea.Tuser}'"
        cursor.execute(check_sql)
        con.commit()
        count = cursor.fetchone()
        print(tea.Tuser)
        print(count)
        if count is None:
            return 1
        # 添加数据
        sql = f"INSERT INTO Teacher (Tname,Tage,Tsex,Tphone,Taddress,Tuser,Tpassword) VALUES('{tea.Tname}','{tea.Tage}','{tea.Tsex}','{tea.Tphone}','{tea.Taddress}','{tea.Tuser}','{tea.Tpassword}')"
        cursor.execute(sql)
        con.commit()
        return cursor.rowcount
    except Exception as e:
        print(f"插入时发生错误:{e}")
        if con is not None:
            con.rollback()
        return 0
    finally:
        dbUtil.closeCon(con)


def addTea(self):
    Tuser = self.TuserInput.text()
    if Tuser.strip() == "":
        self.x = show_custom_message_box("注意!!!", "用户名不能为空!")
        return
    Tpass = self.TpassInput.text()
    if Tpass.strip() == "":
        self.x = show_custom_message_box("注意!!!", "密码不能为空!")
        return
    Tname = self.TnameInput.text()
    if Tname.strip() == "":
        self.x = show_custom_message_box("注意!!!", "姓名不能为空!")
        return
    Tage = self.TageInput.text()
    if Tage.strip() == "":
        self.x = show_custom_message_box("注意!!!", "年龄不能为空!")
        return
    Tphone = self.TphoneInput.text()
    if Tphone.strip() == "":
        self.x = show_custom_message_box("注意!!!", "联系电话不能为空!")
        return
    if self.manRadio.isChecked():
        Tsex = '男'
    else:
        Tsex = '女'
    Tadd = self.TaddInput.toPlainText()
    if Tadd.strip() == "":
        self.x = show_custom_message_box("注意!!!", "家庭住址不能为空!")
        return
    addtea = Tea(Tuser, Tpass, Tphone, Tname, Tsex, Tage, Tphone, Tadd)
    result = addTeaDao.add(addtea)
    if result > 0:
        self.x = show_custom_message_box("系统提示", "注册成功!")
        self.set()
    else:
        self.x = show_custom_message_box("系统提示", "注册失败!")

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-18 17:06
    关注

    引自免费微信小程序:皆我百晓生

    在查看您的代码后,我发现问题可能出在以下几个方面:

    1. 异常处理

      • add 函数中,当执行 SQL 查询时,没有捕获 cursor.fetchone() 的返回值类型。这可能导致如果查询结果不是 None 时,程序无法正确判断用户名是否已存在。
    2. SQL注入

      • 使用字符串拼接的方式构造 SQL 语句可能会导致 SQL 注入攻击。应该使用参数化查询来防止这个问题。例如,可以使用 cursor.execute(sql, (tea.Tname, tea.Tage, tea.Tsex, tea.Tphone, tea.Taddress, tea.Tuser, tea.Tpassword))
    3. 注册逻辑

      • addTea 方法中,您使用了 Tea 类的静态方法 my_construtor,但实际调用时传递的是类实例(addtea),这会导致 TID 属性始终为 None。如果 TID 是需要唯一标识的字段,它应该在创建 Tea 对象时设置。
    4. 注册成功确认

      • addTea 方法中,set() 函数未定义,这可能导致在注册成功后没有正确的清理操作或状态更新。

    下面是修改后的代码示例,修复了上述问题:

    import mysql.connector
    from mysql.connector import cursor
    
    class Tea:
        # 如果 TID 是需要唯一标识的,应该在这里初始化
        def __init__(self, TID=None, Tname=None, Tage=None, Tsex=None, Tphone=None, Taddress=None, Tuser=None, Tpassword=None):
            self.TID = TID
            self.Tname = Tname
            self.Tage = Tage
            self.Tsex = Tsex
            self.Tphone = Tphone
            self.Taddress = Taddress
            self.Tuser = Tuser
            self.Tpassword = Tpassword
    
        @staticmethod
        def my_constructor(TID, Tname, Tage, Tsex, Tphone, Taddress, Tuser, Tpassword):
            obj = Tea(TID, Tname, Tage, Tsex, Tphone, Taddress, Tuser, Tpassword)
            return obj
    
    def add(tea: Tea):
        con = None
        try:
            con = dbUtil.getCon()
            cursor = con.cursor(prepared=True)  # 使用参数化查询
            check_sql = ("SELECT Tuser FROM Teacher WHERE Tuser=%s")
            cursor.execute(check_sql, (tea.Tuser,))
            count = cursor.fetchone()
            print(tea.Tuser)
            print(count)
            if count is None:
                sql = ("INSERT INTO Teacher "
                       "(Tname, Tage, Tsex, Tphone, Taddress, Tuser, Tpassword) "
                       "VALUES (%s, %s, %s, %s, %s, %s, %s)")
                values = (tea.Tname, tea.Tage, tea.Tsex, tea.Tphone, tea.Taddress, tea.Tuser, tea.Tpassword)
                cursor.execute(sql, values)
                con.commit()
                return cursor.rowcount
            else:
                print("用户名已存在")
                return 0
        except Exception as e:
            print(f"插入时发生错误:{e}")
            if con is not None:
                con.rollback()
            return 0
        finally:
            dbUtil.closeCon(con)
    
    def addTea(self):
        Tuser = self.TuserInput.text()
        if Tuser.strip() == "":
            self.x = show_custom_message_box("注意!!!", "用户名不能为空!")
            return
        # ... 其他验证和获取输入的代码不变 ...
    
        # 使用 Tea 类的构造函数创建对象,并确保 TID 有值
        addtea = Tea(TID=None, Tname=Tname, Tage=Tage, Tsex=Tsex, Tphone=Tphone, Taddress=Tadd, Tuser=Tuser, Tpassword=Tpass)
        
        result = addTeaDao.add(addtea)
        if result > 0:
            self.x = show_custom_message_box("系统提示", "注册成功!")
            # 这里假设 set() 是保存数据到数据库或者其他地方的逻辑
            # 如果没有 set(),则考虑在这里添加相应的操作
            # set()
        else:
            self.x = show_custom_message_box("系统提示", "注册失败!")
    

    请确保 dbUtil.getCon()dbUtil.closeCon(con) 是有效的数据库连接和关闭方法,且参数化查询语法适用于您的数据库驱动。如果 TID 确实需要在创建对象时就设置,那么在 Tea 类的构造函数中加上对 TID 的处理。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月21日
  • 创建了问题 4月18日