2017-10-08 1 views
0

Ich möchte, dass mein Code eine if-Anweisung verwendet, um zu überprüfen, in welcher Benutzergruppe sich ein Benutzer befindet, und verschiedene Funktionen für jeden Benutzer aufzurufen. Meine aktuellen Code ist wie folgt:SQLite3-Datensatzüberprüfung

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. 

Was soll ich den Vergleich der Arbeit tun, um, wie meine Platten einen Wert enthalten, die entweder 1 oder 2 ist, aber die Validierung nicht funktioniert.

+0

Was Sie von 'print (user_group) erhalte' 'vor für (Benutzergruppe,) in c:'? Ich bin mir nicht sicher, warum du ein Tupel in deiner For-Schleife machst. – roganjosh

+0

Ich habe für (Benutzergruppe,) in c: aus der Empfehlung eines anderen Benutzers hier auf SQL-Injektion zu verhindern, aber seine Antwort war nicht super klar. Wenn ich drucke, bekomme ich ('2',) –

+0

Sie sind _retrieving_ etwas aus Ihrer Datenbank, also wenn es zur SQL-Injektion ging, wäre es bereits geschehen; Ich bin mir nicht sicher, ob diese Empfehlung sinnvoll ist oder ob sie aus dem Zusammenhang gerissen wurde. Befreien Sie sich von der 'for'-Schleife (Sie benutzen 'fetchone()', so dass Sie nur 1 Ergebnis erhalten) und ändern Sie die 'if' /' elif' Checks in 'if int (user_group [0]) == 1:' etc . – roganjosh

Antwort

0

Wiederholen Sie nicht die gleiche SQL-Abfrage mehr als einmal.

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]() 

Wenn die Abfrage keine Benutzergruppen, dann ist die for-Schleife nicht seinen Körper auszuführen. Wenn usergroup nicht 1 oder 2 ist, wird funcmap[usergroup] eine KeyError auslösen. Wie Sie sagen, diese sollte nicht passieren, aber wenn es die KeyError wird Sie wissen lassen. Vielleicht möchten Sie eine try..except KeyError Anweisung verwenden, um funcmap[usergroup]() den Fehler auf andere Weise (Protokollierung, besser spezifische Fehlermeldung vor dem Beenden, etc.)

Beachten Sie, dass in Abhängigkeit davon, zu handhaben, wie Sie die sqlite3 Verbindung instanziiert und wie Sie eingestellt up die Datenbanktabelle, usergroup kann eine Ganzzahl oder eine Zeichenfolge sein. Wenn es eine Zeichenfolge zurückgibt, möchten Sie möglicherweise eine weitere Frage dazu stellen, wie Sie usergroup als Ganzzahl abrufen können. Alternativ können Sie funcmap ändern Strings wie die dict Schlüssel zu erwarten:

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