App下載

完善pymysql實現(xiàn)用戶登錄驗證的代碼

玹三 2021-11-10 11:14:22 瀏覽數(shù) (2766)
反饋

上一篇文章提到,使用pymysql結(jié)合數(shù)據(jù)庫實現(xiàn)用戶登錄驗證的效果,有個不足之處,就是缺少了當輸入密碼是正確的,用戶名輸入錯誤,然后提示用戶名輸入錯誤的部分。在一番學習思考之后,才發(fā)現(xiàn)是因為自己想得過于復雜了,其實實現(xiàn)起來還是很簡單的。

思考過程

在此之前,我一直糾結(jié)一個問題。用戶名是唯一的,而密碼卻是重復的,一條SQL語句,如何在?fetchone?和?fetchall?之間進行抉擇。于是,腦子就剪不斷,理還亂了,整個都纏繞在一起。在冷靜思考之后,發(fā)現(xiàn)了問題,為什么程序中SQL語句只能是一條?兩個內(nèi)容不能拆分開嗎?

于是,靈光一現(xiàn)。首先使用一條SQL語句,搜索數(shù)據(jù)表中?username?字段是,因為用戶名是唯一的,搜索的結(jié)果集用?fetchone?。判斷結(jié)果集是否為空,不為空就就可以判斷密碼是否一致,一致就成功登錄,不一致就是密碼錯誤。如果結(jié)果集為空,則進行下一條SQL語句的執(zhí)行。

這一條SQL語句搜索數(shù)據(jù)表中?password?字段和密碼一樣的全部信息,這時候使用?fetchall?獲取所有內(nèi)容,返回結(jié)果是一個列表。如果列表為空,就是用戶名和密碼都不正確;如果列表不為空,那么就是用戶名輸入錯誤了。

進行一番測試驗證后,效果還不錯!下面是具體的代碼內(nèi)容。

具體代碼

import pymysql
# 創(chuàng)建數(shù)據(jù)庫連接
conn = pymysql.connect(
    host='localhost',
    user='root',
    password='123456',
    database='db_game'
)
# 獲取用戶輸入的用戶名和密碼
username = input("請輸入用戶名:")
password = input("請輸入密碼:")
# 創(chuàng)建游標
cursor = conn.cursor(pymysql.cursors.DictCursor)
# 查詢數(shù)據(jù)庫中與用戶輸入的用戶名相同的信息
sql = '''SELECT * FROM tbl_user WHERE username=%s'''
# 執(zhí)行sql語言
cursor.execute(sql,username)
# 因為用戶名是唯一的,所以使用fetchone獲取
a = cursor.fetchone()
# 如果獲取的結(jié)果集為空
if a is None:
    ## 查詢數(shù)據(jù)庫中所有和用戶輸入的密碼相同的全部信息
    sql = '''SELECT * FROM tbl_user WHERE password=%s'''
    cursor.execute(sql, [password])
    ## 密碼是可重復的,所以使用了fetchall
    l = cursor.fetchall()
    ## 判斷如果獲取的結(jié)果集列表是空列表,則表示沒有這個用戶。
    if l == []:
        print("用戶名和密碼輸入錯誤!")
    ## 否則就是用戶名輸錯了。
    else:
        print("用戶名輸入錯誤!")
# 獲取的結(jié)果集不為空
else:
    ## 判斷結(jié)果集中password字段的值是否與輸入的密碼相同。如果一致,成功登錄
    if a['password'] == password:
        print('成功登錄!')
    ## 否則就是密碼輸入錯誤
    else:
        print('密碼輸入錯誤!')
cursor.close()
conn.close()

總結(jié)

代碼中或許仍有不足之處,如果大家有更好的建議,還望多多指正!


1 人點贊