如何将数据库中的值与 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 输入进行比较的主要内容,如果未能解决你的问题,请参考以下文章
如何将 pyspark 数据框列中的值与 pyspark 中的另一个数据框进行比较
如何将数据框中的一行的值与另一个数据框中的多行进行比较(包括计算)