Python登录系统连接MySQL数据库时connect_database函数报错问题排查
Python登录系统连接MySQL数据库时connect_database函数报错问题排查
我仔细看了你的代码,发现connect_database()函数里存在好几个明显的错误,同时还有一些数据库连接和逻辑上的问题,下面帮你逐一排查并修正:
一、核心错误点梳理
- 数据库连接参数错误:你的
host参数填的是"admin",这显然不是正确的数据库主机地址(本地数据库通常用"localhost",远程数据库则是对应IP/域名),这个错误会直接导致数据库连接失败,后续查询根本无法执行。 - SQL语法错误:函数里第一行
mycoursor.execute('SELECT FROM AI_login.AI_login')是无效的SQL语句——SELECT关键字后面必须指定要查询的字段(比如*代表所有字段),而且这行查询本身是多余的,可以直接删除。 - 错误使用
self关键字:username = self.usernameEntry1.get()里的self完全没必要,因为usernameEntry1是全局定义的Tkinter输入框,直接用usernameEntry1.get()就能获取内容,用self会触发"找不到属性"的报错。 - SQL查询逻辑混乱+注入风险:你分开查询用户名和密码的方式不仅效率低,还可能出现"用户名和密码分别存在但不匹配"的逻辑漏洞;同时用字符串拼接SQL语句存在严重的SQL注入风险,这是非常不安全的写法。
- 条件判断逻辑错误:
if username == passwordP and password == passwordP完全不符合逻辑——passwordP是游标fetchall()返回的列表(格式类似[('数据库中的密码',)]),不是字符串,拿输入值和列表直接比较永远不会成立。
二、修正后的完整代码
from tkinter import * from tkinter import messagebox, Label import mysql.connector # 修正数据库连接参数,添加异常捕获 try: mydb = mysql.connector.connect( host="localhost", # 替换为你的数据库实际主机地址(本地用localhost) user="admin", passwd="Admin1234", database="AI_login" ) mycoursor = mydb.cursor(buffered=True) except mysql.connector.Error as err: messagebox.showerror("数据库连接失败", f"错误原因: {err}") exit() login = Tk() login.title('Log in') login.geometry('800x700') login.resizable(0, 0) def connect_database(): # 获取输入内容,去除前后空格 username = usernameEntry1.get().strip() password = passwordEntry2.get().strip() # 先判断输入是否为空 if not username or not password: messagebox.showerror("输入错误", "用户名和密码不能为空") return # 使用参数化查询,避免SQL注入,同时验证用户名+密码是否匹配 # 注意:这里的字段名要和你数据库表中的实际字段一致,比如表中是`username`就写`username` check_query = "SELECT * FROM AI_login WHERE username = %s AND password = %s" mycoursor.execute(check_query, (username, password)) result = mycoursor.fetchone() # 用fetchone获取单条匹配记录,更高效 if result: messagebox.showinfo("登录成功", "欢迎登录!") # 这里可以添加登录成功后的逻辑,比如跳转主界面 else: messagebox.showerror("登录失败", "用户名或密码不正确") # 界面组件优化(避免重复变量名) heading = Label(login, text='User Login', font=('Arial', 20), fg='blue') heading.place(x=350, y=70) username_label = Label(login, text='Username:', font=('Arial', 20)) username_label.place(x=230, y=217) usernameEntry1 = Entry(login, font=('Arial', 16), width=18) usernameEntry1.place(x=380,y=225) password_label = Label(login, text='Password:', font=('Arial', 20)) password_label.place(x=235, y=275) passwordEntry2 = Entry(login, font=('Arial', 20, 'bold'), width=20) passwordEntry2.place(x=380,y=283) passwordEntry2.configure(show='*', font=('Arial',16)) loginButton = Button(login, text='Login', font=('Arial', 16),bg='light grey', width=12, height=1, command=connect_database) loginButton.place(x=360, y=430) login.mainloop()
三、关键修改说明
- 添加数据库连接异常捕获:用
try-except包裹连接代码,能直观显示连接失败的原因,避免程序直接崩溃。 - 修正host参数:将
host改为实际的数据库地址,本地开发一般用localhost。 - 参数化SQL查询:用
%s作为占位符,将用户名和密码作为参数传入,彻底避免SQL注入风险,同时一次性验证"用户名+密码"的匹配关系,逻辑更准确。 - 简化条件判断:用
fetchone()获取查询结果,若结果不为空则说明存在匹配记录,登录成功;否则登录失败。 - 输入校验优化:先判断输入是否为空,提前拦截无效输入。
备注:内容来源于stack exchange,提问作者Rawan
相关产品推荐
相关产品推荐

