2017-10-08 5 views
0

私のコードでifステートメントを使用して、ユーザーが属するユーザーグループを確認し、ユーザーごとに異なる機能を呼び出すようにします。次のように私の現在のコードは次のとおりです。私のレコードが1または2のいずれかであるが、検証が動作していない値が含まれているそうであるように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. 

私は、比較の仕事をするために何をすべき。

+0

あなたは 'Cで(ユーザーグループ)のための' 'の前に印刷(USER_GROUP)から何を得るのですか:'?私はあなたの 'for'ループでなぜタプルを作っているのか分かりません。 – roganjosh

+0

私は(usergroup)のために、SQLインジェクションを防ぐためにここに別のユーザの推薦をc:offしましたが、彼の答えは非常に明確ではありませんでした。私が印刷したときに( '2'、) –

+0

データベースから何かを取得しているので、SQLインジェクションが行われていれば既に起こっていたはずです。私はその勧告が意味をなさないか、それが文脈から取り除かれたかどうかはわかりません。 'for'ループを取り除きます(' fetchone() 'を使って1つの結果しか得られないようにします)' if'/'elif'チェックを' if int(user_group [0])== 1: 'などに変更します。 – 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の場合は をお知らせします。あなたはsqlite3接続をインスタンス化し、どのように設定する方法に応じていることを注意

(など、終了する前に、ロギング、より良い特定のエラーメッセージ)他のいくつかの方法でエラーを処理するために funcmap[usergroup]()周り try..except KeyError声明 を使用することをお勧めします usergroupは整数または文字列です。文字列を返す場合は、 usergroupを整数として取得する方法について別の質問をすることもできます。 また、あなたは辞書のキーとして文字列を期待する funcmapを変更することができます:

funcmap = {'1': self.admin_login_successful, '2': self.user_login_successful} 
関連する問題