我已经创建了一个登录界面,作为我正在创建的应用程序的一部分。我在此界面上导出用户名和密码条目的内容,并将它们与存储在python的SQL数据库中的用户名和密码进行比较。
但是,每次我通过在登录数据库中输入我创建的SQL数据库中存在的用户名和密码来测试程序时,程序都会显示一条错误消息(仅当包含用户名和密码时,才会显示此错误消息SQL数据库中不存在用户名和密码条目中的“”。
我尝试打印用户名和密码条目的内容,以确保它们包含有效数据/不为空
我已尝试在我创建的数据库中打印记录,以确保它们是包含在其中的有效数据/它不是空的。
我尝试将用户名和密码输入小部件的内容放入python中的变量中,然后将这些变量中存储的数据与我创建的数据库中存储的用户名和密码进行了比较。
我尝试从SQL数据库中从存储用户名和密码的列表变量中删除标点符号,然后尝试确定在登录界面的输入小部件中输入的用户名和密码是否在这些用户名和密码列表变量中创建。我以为这可能是程序引发错误的原因。
def UserDetailsValidator():
# stores usernames in UserDetails table of program's database
Usernames = []
# stores passwords in UserDetails table of program's database
Passwords = []
UserDetails = []
# retreives all usernames in Users database
for username in c.execute('SELECT Username FROM tblUserDetails'):
Usernames.append(username)
# retrieves all passwords in Users database
for password in c.execute('SELECT Password FROM tblUserDetails'):
Passwords.append(password)
## # creates set of all possible punctuation marks
## PunctuationMarks = set(string.punctuation)
##
## # makes new username and passwords list
## PunctuationFreeUsernames = ''.join(character for character in Usernames if character not in PunctuationMarks)
## print(PunctuationFreeUsernames)
# checks if the username entered is in the Users table of the program's database
for username in range(len(Usernames)):
if UsernameEntry.get() == username:
break
else:
# displays an error message if the password the user enters is not in the Users table
tkinter.messagebox.showerror("","Your username has not been recognised, please try again")
# checks if the password entered is in the Users database
for password in range(len(Passwords)):
if PasswordEntry.get() == password:
# updates variable with username of current user
UsernameofCurrentUser = UsernameEntered
Screen4(UsernameofCurrentUser)
Screen3.destroy()
else:
# displays an error message if the password the user enters is not in the Users database
tkinter.messagebox.showerror("","Your password has not been recognised, please try again")
答案 0 :(得分:0)
这绝对不是完全使用SQL 的方式。您不会用SQL中的所有条目填充Python列表。
相反,您仅从SQL中选择与尝试登录的用户提供的用户名和密码匹配的数据。如果不匹配,则表示密码错误或用户不存在。请参阅https://en.m.wikipedia.org/wiki/Select_(SQL)
中WHERE子句的应用很抱歉,但是您的问题意味着您需要首先学习如何使用SQL。
-
根据您的请求,这是检查提供的登录名和密码是否与SQL中存储的登录名和密码匹配的最简单方法。这不是要放在生产系统中的东西(例如,在生产中,您应该存储加密的密码并加密提交的密码以进行数据库检查)。
请注意,根据您使用的SQL模块,从Python向SQL查询传递参数可能有所不同。有一些模块在命名的:arguments中绑定参数,而那些模块仅允许用“?”替换参数。签名并按位置传递论点。这里我们加上“?”和元组中给出的位置参数。
def UserDetailsValidator(login,password):
c.execute("SELECT userdetails FROM tblUserDetails WHERE username=? AND userpass=?", (login,password))
results=c.fetchall()
if len(results)>1:
print "Error. More than one login with this password found in database"
return
elif len(results)<1:
print "Wrong username or password entered"
return
# else found exactly 1 result with that username & pass combo,
# meaning that user supplied the correct pass
userinfo=results[0]
# there is just 1 row returned from SQL, which contains the userinfo we want.
# can work with that now.