让 Python 正确地将用户名输入与 MySQL DB 中的用户名进行比较的问题
Posted
技术标签:
【中文标题】让 Python 正确地将用户名输入与 MySQL DB 中的用户名进行比较的问题【英文标题】:Issue with getting Python to correctly compare username input to username from MySQL DB 【发布时间】:2021-07-11 21:30:31 【问题描述】:我正在使用 PyCharm 运行 Python(使用 tkinter
和 mysql.connector
)并且我正在尝试运行以下代码:
from tkinter import *
import tkinter.messagebox as MessageBox
import mysql.connector as mysql
root = Tk()
top = Toplevel()
top.geometry("900x600")
top.title("LIMS")
global mycursor
db = mysql.connect(
host="localhost",
user="root",
password="mypass",
database="db name"
)
global user
def loginprogram():
user = e_username.get()
pw = e_password.get()
mycursor = db.cursor()
myuser_queue=[]
user_query = "SELECT username FROM user WHERE username =%s" % (username)
try:
mycursor.execute("SELECT username FROM user")
users = mycursor.fetchall()
for x in users:
print(x)
if (user == x):
print("Correct!")
myuser_queue.append(x)
print(myuser_queue)
except:
print('Error occurred')
if (user) in myuser_queue:
print("True " + user)
else:
print("Still wrong")
mycursor.execute("SELECT password FROM user")
passwords = mycursor.fetchall()
for x in passwords:
print(x)
def exitprogram():
top.destroy()
root.destroy()
sys.exit()
title = Label(top, text='Enter Log In Credentials', font='Helvetica', 10)
title.place(x=20,y=30)
username = Label(top,text='Enter Username',font=('bold',10))
username.place(x=20,y=60)
e_username = Entry(top)
e_username.place(x=150, y=60)
password = Label(top,text='Enter Password',font=('bold',10))
password.place(x=20,y=90)
e_password = Entry(top)
e_password.place(x=150, y=90)
login_button = Button(top, text="Login", font=("bold", 10), bg="white",command=lambda: loginprogram())
login_button.place(x=150, y=120)
exitbutton = Button(top, text="Exit", font=("bold", 10), bg="white",command=lambda: exitprogram())
exitbutton.place(x=150, y=150)
root.withdraw()
root.mainloop()
我已将它设置为打印并让它正确地从数据库中提取用户名。它还正确地将每个用户名放入列表中。问题似乎在以下部分:
我也尝试了多次查询迭代,但实际 mycursor
中的一次似乎是唯一正确从 MySQL 数据库中提取信息的一次。
if (user) in myuser_queue:
print("True " + user)
【问题讨论】:
【参考方案1】:cursor.fetchall()
返回元组列表
cur.execute("""SELECT username FROM users""")
rows = cur.fetchall()
for row in rows:
print(row)
输出:
('Alice',)
('Bob',)
('Carol',)
但问题中的代码假定返回值是一个字符串列表。
您想提取每个元组中的第一个元素:
mycursor.execute("SELECT username FROM user")
users = mycursor.fetchall()
for row in users:
print(row[0])
if (user == row[0]):
print("Correct!")
myuser_queue.append(row[0])
或者
mycursor.execute("SELECT username FROM user")
users = mycursor.fetchall()
# Unpack x from its containing tuple
for (x,) in users:
print(x)
if (user == x):
print("Correct!")
myuser_queue.append(x)
另见this Q&A。
【讨论】:
以上是关于让 Python 正确地将用户名输入与 MySQL DB 中的用户名进行比较的问题的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法通过signalR中的唯一指导正确地将消息发送给所有用户?
如何正确地将 OData 与 ASP.net Core 集成