让 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(使用 tkintermysql.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 集成

如何正确地将 id 生成器序列与表相关联

如何在 Spark 中正确地将数字特征与文本(词袋)结合起来?

如何正确地将纬度和经度坐标插入 mySQL 浮点数?

如何正确地将 MySQL 行折叠到单个列表中