本文讲解如何正确使用参数化查询从 mysql 表中检索同时匹配用户名和密码的单行记录,重点纠正 sql 语法错误、防止 sql 注入,并提供可直接运行的安全示例。
在实现登录功能时,一个常见误区是误用 LIKE 和逗号分隔的列名(如 username, password LIKE '%s','%s'),这在 SQL 中完全无效——MySQL 不支持这种语法,会导致语法错误或意外的全表扫描。正确的做法是:对每个字段单独比较,并用 AND 连接条件。
✅ 正确写法(推荐):
cursor.execute("SELECT * FROM user WHERE username = %s AND password = %s", (username, password))
ecreds = cursor.fetchall()
if len(ecreds) == 1:
print(f"Login successful. Welcome, {ecreds[0][1]}") # 假设 name 在第二列⚠️ 关键要点说明:
? 进阶建议:
为提升健壮性,可进一步优化查询逻辑:
cursor.execute("SELECT id, username, role FROM user WHERE username = %s", (username,))
user = cursor.fetchone()
if user and bcrypt.checkpw(password.encode('utf-8'), user[3].encode('utf-8')): # 假设 pwd_hash 在第4列
print(f"Login successful. Welcome, {user[1]}")
else:
print("
Invalid credentials.")总结:一次准确、安全的登录查询 = 正确的 SQL 条件(WHERE col1 = %s AND col2 = %s) + 参数化执行 + 密码安全哈希验证。摒弃字符串拼接与模糊匹配,是构建可信认证系统的第一步。