上一篇文章提到,使用pymysql結(jié)合數(shù)據(jù)庫(kù)實(shí)現(xiàn)用戶(hù)登錄驗(yàn)證的效果,有個(gè)不足之處,就是缺少了當(dāng)輸入密碼是正確的,用戶(hù)名輸入錯(cuò)誤,然后提示用戶(hù)名輸入錯(cuò)誤的部分。在一番學(xué)習(xí)思考之后,才發(fā)現(xiàn)是因?yàn)樽约合氲眠^(guò)于復(fù)雜了,其實(shí)實(shí)現(xiàn)起來(lái)還是很簡(jiǎn)單的。
思考過(guò)程
在此之前,我一直糾結(jié)一個(gè)問(wèn)題。用戶(hù)名是唯一的,而密碼卻是重復(fù)的,一條SQL語(yǔ)句,如何在?fetchone
?和?fetchall
?之間進(jìn)行抉擇。于是,腦子就剪不斷,理還亂了,整個(gè)都纏繞在一起。在冷靜思考之后,發(fā)現(xiàn)了問(wèn)題,為什么程序中SQL語(yǔ)句只能是一條??jī)蓚€(gè)內(nèi)容不能拆分開(kāi)嗎?
于是,靈光一現(xiàn)。首先使用一條SQL語(yǔ)句,搜索數(shù)據(jù)表中?username
?字段是,因?yàn)橛脩?hù)名是唯一的,搜索的結(jié)果集用?fetchone
?。判斷結(jié)果集是否為空,不為空就就可以判斷密碼是否一致,一致就成功登錄,不一致就是密碼錯(cuò)誤。如果結(jié)果集為空,則進(jìn)行下一條SQL語(yǔ)句的執(zhí)行。
這一條SQL語(yǔ)句搜索數(shù)據(jù)表中?password
?字段和密碼一樣的全部信息,這時(shí)候使用?fetchall
?獲取所有內(nèi)容,返回結(jié)果是一個(gè)列表。如果列表為空,就是用戶(hù)名和密碼都不正確;如果列表不為空,那么就是用戶(hù)名輸入錯(cuò)誤了。
進(jìn)行一番測(cè)試驗(yàn)證后,效果還不錯(cuò)!下面是具體的代碼內(nèi)容。
具體代碼
import pymysql
# 創(chuàng)建數(shù)據(jù)庫(kù)連接
conn = pymysql.connect(
host='localhost',
user='root',
password='123456',
database='db_game'
)
# 獲取用戶(hù)輸入的用戶(hù)名和密碼
username = input("請(qǐng)輸入用戶(hù)名:")
password = input("請(qǐng)輸入密碼:")
# 創(chuàng)建游標(biāo)
cursor = conn.cursor(pymysql.cursors.DictCursor)
# 查詢(xún)數(shù)據(jù)庫(kù)中與用戶(hù)輸入的用戶(hù)名相同的信息
sql = '''SELECT * FROM tbl_user WHERE username=%s'''
# 執(zhí)行sql語(yǔ)言
cursor.execute(sql,username)
# 因?yàn)橛脩?hù)名是唯一的,所以使用fetchone獲取
a = cursor.fetchone()
# 如果獲取的結(jié)果集為空
if a is None:
## 查詢(xún)數(shù)據(jù)庫(kù)中所有和用戶(hù)輸入的密碼相同的全部信息
sql = '''SELECT * FROM tbl_user WHERE password=%s'''
cursor.execute(sql, [password])
## 密碼是可重復(fù)的,所以使用了fetchall
l = cursor.fetchall()
## 判斷如果獲取的結(jié)果集列表是空列表,則表示沒(méi)有這個(gè)用戶(hù)。
if l == []:
print("用戶(hù)名和密碼輸入錯(cuò)誤!")
## 否則就是用戶(hù)名輸錯(cuò)了。
else:
print("用戶(hù)名輸入錯(cuò)誤!")
# 獲取的結(jié)果集不為空
else:
## 判斷結(jié)果集中password字段的值是否與輸入的密碼相同。如果一致,成功登錄
if a['password'] == password:
print('成功登錄!')
## 否則就是密碼輸入錯(cuò)誤
else:
print('密碼輸入錯(cuò)誤!')
cursor.close()
conn.close()
總結(jié)
代碼中或許仍有不足之處,如果大家有更好的建議,還望多多指正!