当前位置:
首页
文章
后端
详情

完善pymysql实现用户登录验证的代码

上一篇文章提到,使用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()

总结

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


免责申明:本站发布的内容(图片、视频和文字)以转载和分享为主,文章观点不代表本站立场,如涉及侵权请联系站长邮箱:xbc-online@qq.com进行反馈,一经查实,将立刻删除涉嫌侵权内容。

同类热门文章

深入了解C++中的new操作符:使用具体实例学习

C++中的new操作符是动态分配内存的主要手段之一。在程序运行时,我们可能需要动态地创建和销毁对象,而new就是为此提供了便利。但是,使用new也常常会引发一些问题,如内存泄漏、空指针等等。因此,本文将通过具体的示例,深入介绍C++中的new操作符,帮助读者更好地掌握其使用。


深入了解C++中的new操作符:使用具体实例学习

怎么用Java反射获取包下所有类? 详细代码实例操作

Java的反射机制就是在运行状态下,对于任何一个类,它能知道这个类的所有属性和方法;对于任何一个对象,都能调用这个对象的任意一个方法。本篇文章将通过具体的代码示例,展示如何通过Java反射来获取包下的所有类。


怎么用Java反射获取包下所有类? 详细代码实例操作

员工线上学习考试系统

有点播,直播,在线支付,三级分销等功能,可以对学员学习情况的监督监控,有源码,可二次开发。支持外网和局域网私有化部署,经过测试源码完整可用!1、视频点播:视频播放,图文资料,课件下载,章节试学,限时免

员工线上学习考试系统

了解Java中的volati关键字的作用 以及具体使用方法

本篇文章将和大家分享一下Java当中的volatile关键字,下面将为各位小伙伴讲述volatile关键字的作用以及它的具体使用方法。


了解Java中的volati关键字的作用 以及具体使用方法

Java Map 所有的值转为String类型

可以使用 Java 8 中的 Map.replaceAll() 方法将所有的值转为 String 类型: 上面的代码会将 map 中所有的值都转为 String 类型。 HashMap 是 Java

Java Map 所有的值转为String类型