如何将数据库中的值与 python 输入进行比较

Posted

技术标签:

【中文标题】如何将数据库中的值与 python 输入进行比较【英文标题】:How can I compare a value from database to python input 【发布时间】:2021-11-16 20:45:20 【问题描述】:

所以我正在尝试创建一个登录系统,有点像普通的 python 终端。我做了一个注册功能,但我正在为登录而苦苦挣扎。我正在尝试将我的输入与用户名和密码进行比较,完成后我将添加 ID。但是我该怎么做呢,我什么都试过了。

当我运行代码并输入正确的详细信息时,它告诉我“登录失败,用户名或密码错误”,这意味着我的 if 语句有问题。

    import mysql.connector
mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  password=""
)
mycursor = mydb.cursor(buffered=True)

def login():
    mycursor.execute("USE logintest")
    login_username = input("Please enter your username or email: ")
    login_password = input("Please enter your password: ")
    
    check_login = f"SELECT username FROM users WHERE username = 'login_username'"
    check_password = f"SELECT password FROM users WHERE password = 'login_password'"

    mycursor.execute(check_login)
    username_result = mycursor.fetchall()

    mycursor.execute(check_password)
    password_result = mycursor.fetchall()

    passwordr = password_result
    usernamer = username_result

    print(usernamer)
    print(passwordr)

    if login_password == passwordr and login_username == usernamer:
        print("Logged in successfully")
    else: 
        print("Login failed, wrong username or password")
        
        
    
def register():
    mycursor.execute("USE logintest")
    new_username = input("please pick a username: ")
    new_email = input("please enter your email: ")
    new_password = input("please pick a password: ")
    insert_new_user = "INSERT INTO users (username, email, password) VALUES (%s, %s, %s)"
    new_user = (new_username, new_email, new_password)
    mycursor.execute(insert_new_user, new_user)
    mydb.commit()
    print("User successfully created! insert id:", mycursor.lastrowid)
    

def options():
    print("1. login")
    print("2. register")
    options = input("please pick 1 or 2: ")
    if "1" in options:
        login()
    elif "2" in options:
        register()
    else: 
        print("please only select 1 or 2")
        options()

options()

【问题讨论】:

试着更详细地解释你的程序在做什么而不是它应该做什么 @janpeterka 我刚刚编辑了它:) "SELECT password FROM users WHERE password = 'login_password'" 不应该是WHERE username = 'login_username' 吗?因为需要这个当前用户密码 一个用于用户名,另一个用于密码@sittsering 我了解用户部分,但不了解密码部分。用户名是唯一的,但不是密码。 【参考方案1】:

您应该创建一个函数来验证登录详细信息。这是验证登录详细信息的方法,它应该在函数内部:

         try:
        username = input("your username")
        password = input("your password")

        conn = (your connection code);
        result = conn.execute("SELECT * FROM yourTable WHERE usernameColumnOfYourTable = ? AND passwordColumnOFyourTable = ?", (username, password))
        print("connected to database")
        if (len(result.fetchall()) > 0):
            print("user found")

        else:
            print("user not found")

    except Exception as err:
        print("couldn't connect")
        print("General error :: ", err)

注意:?是 pyodbc 模块的参数标记,如果您使用的是 mysql 连接器,请替换 ?与 %s 签约

但如果您使用的是散列(加盐)密码,则格式会有所不同。

将此逻辑应用于您的代码:

 def login():
connection = (establish your database connection here)
login_username = input("Please enter your username or email: ")
login_password = input("Please enter your password: ")

result = connection.execute("SELECT username FROM users WHERE username = ? AND password = ?",(login_username, login_password) )"

if (len(result.fetchall()) > 0):

    print("Logged in successfully")
else: 
    print("Login failed, wrong username or password")
    
    

【讨论】:

【参考方案2】:

通常当你在python中从数据库中获取数据时,它会返回一个数据列表,而python中的输入是一个字符串,所以换句话说,你是在将一个字符串与一个永远为假的列表进行比较。

【讨论】:

哦,那我该如何正确比较它们呢? @skep_sickomode 试试这个passwordr = password_result[0] usernamer = username_result[0] 它不起作用,但我检查了用户名的类型,它说的是元组 因为您将一次比较单个用户,请使用 mycursor.fetchone() 然后选择索引 0 处的数据 是的,所以从元组中选择您想要使用索引的数据,例如:mycursor.fetchone()[0]。类似的东西

以上是关于如何将数据库中的值与 python 输入进行比较的主要内容,如果未能解决你的问题,请参考以下文章

如何将html输入的值与sql数据库的值进行比较

如何将 pyspark 数据框列中的值与 pyspark 中的另一个数据框进行比较

如何将数据框中的一行的值与另一个数据框中的多行进行比较(包括计算)

将 SQL 表中的值与文本框中的条目进行比较

如何将二维数组中的值与 GoLang 中的一维数组中的值进行比较?

如何将地图中的值与阈值进行比较并将大于最小阈值的值放入集合中