本文讲解如何正确使用参数化查询从 mysql 表中检索同时匹配用户名和密码的单行数据,避免 sql 注入风险,并修正常见的语法与逻辑错误。
在实现登录功能时,一个常见误区是试图用 LIKE 或逗号分隔的方式一次性比对多个字段(如 WHERE username, pass
word LIKE '%s','%s'),这在 SQL 中语法非法,也不会按预期工作。MySQL 不支持这种元组式匹配语法;必须对每个字段单独指定条件,并用逻辑运算符(如 AND)连接。
✅ 正确写法应使用参数化查询(即预编译语句),将变量作为参数传入 execute() 方法,由数据库驱动自动处理转义与类型适配:
cursor.execute("SELECT * FROM user WHERE username = %s AND password = %s", (username, password))
ecreds = cursor.fetchall()⚠️ 注意事项:
import bcrypt
# 登录时验证
if bcrypt.checkpw(password.encode('utf-8'), stored_hash):
print("Login successful. Welcome, " + username)user = cursor.fetchone()
if user:
print("Login successful. Welcome, " + user['username']) # 若使用字典游标? 总结:始终坚持「参数化查询 + 密码哈希 + 显式字段条件」三原则,才能构建安全、健壮的用户认证逻辑。