嗨我想在tkinter中创建一个简单的登录模块,因为我通过条目小部件从用户那里获取输入,并通过if循环将该密码与数据库中的密码进行比较...但由于某种原因,密码不匹配,所以我尝试了一些测试,并且它非常适合....
import sqlite3
conn=sqlite3.connect('auth_rWebsites.db')
c=conn.cursor()
def check_password(key):
thePass= c.execute("SELECT pass FROM user_pass")
if key == thePass:
print("right Password")
else:
print("Wrong Password")
rows= c.execute("SELECT * FROM user_pass")
for row in rows:
print row
check_password("root")
这个上面简单的测试代码我写的.. 输出
(u'root',)
Wrong Password
所以有人请解释一下为什么会发生这种情况,我该怎么做才能匹配呢....
答案 0 :(得分:3)
c.execute("SELECT pass FROM user_pass")
返回一个元组,而不是字符串,但key
是一个字符串。您需要从元组中获取第一个值并将其与key
参数进行比较,因此请将函数更改为:
def check_password(key):
thePass= c.execute("SELECT pass FROM user_pass")[0] # Changed here
if key == thePass:
print("right Password")
else:
print("Wrong Password")
答案 1 :(得分:2)
thePass
是一个可复制的tuple
,key
是一个字符串。
通常,python db api总是将数据库行作为元组返回,因为您可以在语句中选择多个内容。而不是让需要查看查询的混淆逻辑来确定行的返回类型(对于数据库api和调用者),规范说只是总是返回一个元组。
您需要正确比较key
行...
rows = c.execute("Select pass FROM user_pass")
for row in rows:
if row[0] == thePass:
print("right password")
return
else:
print("Wrong Password")
注意,这可能不是你真正想要的。它所做的只是验证user_pass
表中的一行是否具有pass
值。更有可能的是,您希望根据用户名过滤查询,然后检查密码:
c.execute("SELECT pass FROM user_pass WHERE username = ?", username)
result = c.fetchone() # username should be unique I assume :-)
if result[0] == salt_and_hash(key):
print("Yeah!")
else:
print("No!")