2017-10-08 123 views
0

我希望我的代码使用if语句来检查用户所在的用户组,然后为每个用户调用不同的函数。我当前的代码如下:SQLite3记录验证

c.execute('SELECT * from users WHERE username=? AND password =?', 
       (username_input, password_input)) 
    if c.fetchone() is not None: 
     c.execute('SELECT usergroup from users WHERE username=? AND password=?', 
           (username_input, password_input)) 
     user_group = c.fetchone() 
     for (usergroup,) in c: 
      if user_group == 1: 
       App.admin_login_successful(self) 
      elif user_group == 2: 
       App.user_login_successful(self) 
      else: 
       App.user_login_successful(self) 
       # This shouldn't happen, as all records should theoretically contain a value for usergroup. 

我应该怎么做,使比较工作,我的记录确实包含的值是1或2,但验证不工作。

+0

你从''之前在C(用户组)'打印(USER_GROUP)得到什么:'?我不确定你为什么要在你的for循环中创建一个元组。 – roganjosh

+0

我为(usergroup,)做了c:关闭其他用户在这里的建议以防止SQL注入,但他的回答并不是非常清楚。当我打印时,我得到('2',) –

+0

您正在从您的数据库中检索一些东西,所以如果要进行SQL注入,它已经发生了;我不确定这个建议是否有意义,或者是因为这个建议不符合上下文。摆脱'for'循环(你使用'fetchone()',所以你只能得到1个结果),并将'if' /'elif'检查改为'if int(user_group [0])== 1:'etc 。 – roganjosh

回答

0

不要多次重复相同的sql查询。

funcmap = {1: self.admin_login_successful, 2: self.user_login_successful} 
c.execute('SELECT usergroup from users WHERE username=? AND password=?', 
      (username_input, password_input)) 
for (usergroup,) in c: 
    funcmap[usergroup]() 

如果查询没有返回用户组,然后for循环不会 执行其身。如果usergroup不是1或2,则 funcmap[usergroup]将增加KeyError。正如你所说,这个 不应该发生,但如果它KeyError会让你 知道。你可能希望使用try..except KeyError声明 各地funcmap[usergroup]()来处理一些其他方式的错误(日志记录,在退出之前更好的特定错误消息,等等),这取决于你如何实例化的sqlite3连接

注意,你怎么设置up数据库表,usergroup可能是一个整数或字符串。如果它返回一个字符串,你可能想问另一个关于如何检索usergroup作为整数的问题。 或者,你可以改变funcmap期望字符串作为字典键:

funcmap = {'1': self.admin_login_successful, '2': self.user_login_successful}