上一篇文章提到,使用pymysql结合数据库实现用户登录验证的效果,有个不足之处,就是缺少了当输入密码是正确的,用户名输入错误,然后提示用户名输入错误的部分。在一番学习思考之后,才发现是因为自己想得过于复杂了,其实实现起来还是很简单的。

思考过程

在此之前,我一直纠结一个问题。用户名是唯一的,而密码却是重复的,一条SQL语句,如何在​fetchone​和​fetchall​之间进行抉择。于是,脑子就剪不断,理还乱了,整个都缠绕在一起。在冷静思考之后,发现了问题,为什么程序中SQL语句只能是一条?两个内容不能拆分开吗?

于是,灵光一现。首先使用一条SQL语句,搜索数据表中​username​字段是,因为用户名是唯一的,搜索的结果集用​fetchone​。判断结果集是否为空,不为空就就可以判断密码是否一致,一致就成功登录,不一致就是密码错误。如果结果集为空,则进行下一条SQL语句的执行。

这一条SQL语句搜索数据表中​password​字段和密码一样的全部信息,这时候使用​fetchall​获取所有内容,返回结果是一个列表。如果列表为空,就是用户名和密码都不正确;如果列表不为空,那么就是用户名输入错误了。

进行一番测试验证后,效果还不错!下面是具体的代码内容。

具体代码

import pymysql
# 创建数据库连接
conn = pymysql.connect(
    host='localhost',
    user='root',
    password='123456',
    database='db_game'
)
# 获取用户输入的用户名和密码
username = input("请输入用户名:")
password = input("请输入密码:")
# 创建游标
cursor = conn.cursor(pymysql.cursors.DictCursor)
# 查询数据库中与用户输入的用户名相同的信息
sql = '''SELECT * FROM tbl_user WHERE username=%s'''
# 执行sql语言
cursor.execute(sql,username)
# 因为用户名是唯一的,所以使用fetchone获取
a = cursor.fetchone()
# 如果获取的结果集为空
if a is None:
    ## 查询数据库中所有和用户输入的密码相同的全部信息
    sql = '''SELECT * FROM tbl_user WHERE password=%s'''
    cursor.execute(sql, [password])
    ## 密码是可重复的,所以使用了fetchall
    l = cursor.fetchall()
    ## 判断如果获取的结果集列表是空列表,则表示没有这个用户。
    if l == []:
        print("用户名和密码输入错误!")
    ## 否则就是用户名输错了。
    else:
        print("用户名输入错误!")
# 获取的结果集不为空
else:
    ## 判断结果集中password字段的值是否与输入的密码相同。如果一致,成功登录
    if a['password'] == password:
        print('成功登录!')
    ## 否则就是密码输入错误
    else:
        print('密码输入错误!')
cursor.close()
conn.close()

总结

代码中或许仍有不足之处,如果大家有更好的建议,还望多多指正!