在Python sqlite3和tkinter中验证密码

kt06eoxx  于 2023-03-03  发布在  SQLite
关注(0)|答案(1)|浏览(149)
import sqlite3
from tkinter import *

def clear_fields():
    enter1.delete(0, END)
    enter2.delete(0, END)

conn = sqlite3.connect("main.db")
c = conn.cursor()
c.execute(
    """CREATE TABLE IF NOT EXISTS admins(
        admin_id INTEGER PRIMARY KEY,
        name text,
        password text
        )"""
)
conn.commit()

def pass_check():
    c.execute("SELECT * FROM admins")
    chck = c.fetchall()
    for i in chck:
        if i[(1)] == enter1.get() and i[(2)] == enter2.get():
            break
            print("login sucess")
        else:
            print("Accses Denied")

root = Tk()
root.geometry("250x180+550+200")
root.resizable(False, False)
root.title("Admin Login")
root.iconbitmap("login.ico")

labl1 = Label(text="User name: ")
labl1.place(x=10, y=10)
labl2 = Label(text="Password: ")
labl2.place(x=10, y=70)
usr = ""
pas = ""
enter1 = Entry()
enter1.place(x=80, y=10)
enter2 = Entry(show="*")
enter2.config()
enter2.place(x=80, y=70)

ok_btn = Button(text="Login", width=6, height=1, command=pass_check)
ok_btn.place(x=150, y=100)
clear_btn = Button(text="Clear", width=6, height=1, command=clear_fields)
clear_btn.place(x=80, y=100)

root.mainloop()

在我的终端,如果我输入正确的用户名和密码,我得到登录成功访问被拒绝
如果我输入了错误的凭据,我会得到拒绝访问拒绝访问我在数据库的管理表中只有2个管理员,我认为问题出在for循环语句中,但我似乎不知道是什么。

kq4fsx7k

kq4fsx7k1#

我想知道为什么你会因为break语句而得到“login success”,你需要在print(...)之后调用break,而且你需要在forelse块中调用print("Access Denied")

def pass_check():
    c.execute("SELECT * FROM admins")
    chck = c.fetchall()
    for i in chck:
        if i[(1)] == enter1.get() and i[(2)] == enter2.get():
            print("login sucess")
            break
    else:
        print("Accses Denied")

但是,您不需要从数据库表中获取所有记录,只需使用SQL直接检查凭据的有效性:

def pass_check():
    c.execute("SELECT 1 FROM admins WHERE name = ? and password = ?",
              (enter1.get(), enter2.get()))
    result = c.fetchone()
    if result:
        print("Login Success")
    else:
        print("Access Denied")

相关问题