使用数据库使用python登录

使用数据库使用python登录,python,mysql,database,tkinter,Python,Mysql,Database,Tkinter,我试图让用户登录,而如果他们键入正确的用户名和密码,他们将能够这样做,但我不断得到一个错误,当我输入登录详细信息 def login(self): global con if self.txt_user.get() == "" or self.txt_pass.get() == "": messagebox.showerror("Error", "Please fill up all field

我试图让用户登录,而如果他们键入正确的用户名和密码,他们将能够这样做,但我不断得到一个错误,当我输入登录详细信息

def login(self):
    global con
    if self.txt_user.get() == "" or self.txt_pass.get() == "":
        messagebox.showerror("Error", "Please fill up all fields!")
    else:
        try :
            con=pymysql.connect(host="localhost",user="root",password="",database="employee")
            cur=con.cursor()
            cur.execute("select * from employeelist where username=%s",self.txt_user.get())
            row=cur.rowcount
            print(row)
            if row != None :
                cur.execute("select password from employeelist where username=%s", self.txt_pass.get())
                row1 = cur.rowcount
                print(row1)
                if(row1 != None):
                    messagebox.showinfo("Success", "Login Successful", parent=self.root)
                    m = menu
                    m.Menu(root) 
                else:
                    messagebox.showerror("Error", "Wrong Password. Please try again!")
            else:
                messagebox.showerror("Error, Wrong Username or Password. Please try again!")
        except Exception as ex:
            con.close()
            messagebox.showerror("Error",f"Error due to: {str(ex)}",parent=self.root)

您正在使用密码(即
self.txt\u pass.get()
)查找用户名,因此它找不到任何记录,因此您一直都会遇到错误。ez fix

存在以下问题:

  • rowcount
    将是一个数字,永远不会是
    None
    ,因此
    如果是row!=无
    将始终为
  • 选择中使用了
    self.txt\u pass.get()。。。如果用户名=%s
    不正确,则应改用
    self.txt\u user.get()
出于安全考虑,通常我们不会告诉用户用户名或密码是否不正确。这将使用户信息暴露给遭受暴力攻击的黑客。只要告诉他们成功或失败就足够了。也不要在数据库中存储纯文本密码。密码应该加密

您还可以使用single SELECT检查凭据:

    def login(self):
        user = self.txt_user.get().strip()
        passwd = self.txt_pass.get().strip() 
        if user == "" or passwd == "":
            messagebox.showerror("Error", "Please fill up all fields!")
        else:
            try :
                con = pymysql.connect(host="localhost", user="root", password="", database="employee")
                cur = con.cursor()
                cur.execute("SELECT 1 from employeelist WHERE username = %s and password = %s", (user, passwd))
                if cur.rowcount == 1:
                    messagebox.showinfo("Success", "Login Successful", parent=self.root)
                else:
                    messagebox.showerror("Error", "Invalid credentials. Please try again!")
            except Exception as ex:
                messagebox.showerror("Error", f"Error due to: {str(ex)}", parent=self.root)
            finally:
                con.close()

您还可以使用callproc选项。 导入pymysql

            try:
                conn = pymysql.Connect( 
                        host='localhost', 
                        user='root',  
                        passwd = '', 
                        db='testing' 
                        #,autocommit=True
                        )
                
                
                #pymysql.cursors.DictCursor
                cur = conn.cursor() 
                params = ('official',1)
                cur.callproc('getlogindetails',args=params)
                # cur.execute("call getlogindetails(?,?)", params)
                
                ls = list(cur.fetchall()) 

                #your logic here based on the list value

            finally:
                conn.close()
程序: 分隔符$$

        DROP PROCEDURE IF EXISTS `testing`.`getlogindetails` $$
        CREATE DEFINER=`root`@`localhost` PROCEDURE `getlogindetails`(in inusername 
                                                 varchar(100),in inloginid integer)
        BEGIN
            select  fname,id,lname from details where id < 10;
        END $$

        DELIMITER ;
删除过程(如果存在)`testing`.`getlogindetails`$$
CREATE DEFINER=`root`@`localhost`过程`getlogindetails`(在inusername中)
varchar(100),在inloginid整数中)
开始
从id<10的详细信息中选择fname、id、lname;
结束$$
定界符;

您遇到了什么错误?你做了什么来调试这个?您是否验证了
self.txt\u user.get()
self.txt\u pass.get()
正在返回您认为应该返回的内容?另外,您是否确定在某些情况下,
cur.rowcount
可以返回
None
而不是零?
        DROP PROCEDURE IF EXISTS `testing`.`getlogindetails` $$
        CREATE DEFINER=`root`@`localhost` PROCEDURE `getlogindetails`(in inusername 
                                                 varchar(100),in inloginid integer)
        BEGIN
            select  fname,id,lname from details where id < 10;
        END $$

        DELIMITER ;