之前學(xué)習(xí)過(guò)的用戶(hù)登錄驗(yàn)證,全都是在程序中完成的,并沒(méi)有和數(shù)據(jù)庫(kù)發(fā)生任何的接觸。最近在學(xué)習(xí)數(shù)據(jù)庫(kù)sql語(yǔ)言,突發(fā)奇想結(jié)合數(shù)據(jù)庫(kù)完成用戶(hù)登錄驗(yàn)證。具體實(shí)現(xiàn)思路和過(guò)程如下:
1、首先在數(shù)據(jù)庫(kù)中創(chuàng)建一張用戶(hù)相關(guān)信息的表,主要的是用戶(hù)名和密碼。這里面 id 是主鍵,用戶(hù)名是唯一的。
2、導(dǎo)入pymysql庫(kù),并創(chuàng)建數(shù)據(jù)庫(kù)連接和游標(biāo)。
import pymysql
conn = pymysql.connect(
host='localhost',
user='root',
password='123456',
database='db_game'
)
cursor = conn.cursor(pymysql.cursors.DictCursor)
3、編寫(xiě)sql。由于這里用戶(hù)名是唯一的,所以我只需要檢索用戶(hù)名相應(yīng)的那一條信息,然后將密碼進(jìn)行對(duì)比,一樣就可以成功登陸了。
sql = '''
SELECT * FROM tbl_user WHERE username=%s
'''
4、獲取用戶(hù)輸入的用戶(hù)名和密碼。
username = input('請(qǐng)輸入用戶(hù)名:')
password = input('請(qǐng)輸入密碼:')
5、執(zhí)行sql語(yǔ)句,獲取數(shù)據(jù)庫(kù)表中的信息。由于用戶(hù)名唯一,所以一定只有一條信息,因此使用了fetchone()獲取信息。
cursor.execute(sql, username)
a = cursor.fetchone()
6、做判斷。如果返回的結(jié)果集為空,說(shuō)明輸入的用戶(hù)名不存在于數(shù)據(jù)表中。如果存在,進(jìn)行對(duì)比密碼,對(duì)比不成功就是密碼錯(cuò)誤;對(duì)比成功,就可以成功登錄。
if a is None:
print("用戶(hù)不存在!")
elif a['password'] != password:
print("密碼錯(cuò)誤!")
else:
print("成功登錄!")
7、最后不要忘記了關(guān)閉游標(biāo)和數(shù)據(jù)庫(kù)。
cursor.close()
conn.close()
8、運(yùn)行結(jié)果
9、總結(jié)
上述內(nèi)容就是關(guān)于我對(duì)于和數(shù)據(jù)庫(kù)結(jié)合的用戶(hù)登錄驗(yàn)證的簡(jiǎn)單實(shí)現(xiàn)。但此中亦有不完美之處,就是缺少了一部分:如果密碼正確,用戶(hù)名不正確,提示用戶(hù)名錯(cuò)誤的內(nèi)容。