2017-10-08 2 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

SQL injection을 막기 위해 여기에 다른 사용자의 추천을 c : off로 (usergroup)했습니다.하지만 그의 대답은 명확하지 않습니다. 내가 인쇄 할 때 ('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]() 

쿼리는 루프에 대한 가 몸을 실행하지 않습니다 다음에는 사용자 그룹을 반환합니다. usergroup이 1 또는 2가 아닌 경우 funcmap[usergroup]KeyError입니다. 말씀 드린대로이 은 발생하지 않아야하지만 KeyError을 입력하면 알 수 있습니다. 당신은 다른 방법으로 오류 (로그, 종료하기 전에 더 나은 특정 오류 메시지 등)는 sqlite3 연결을 인스턴스화하는 방법에 따라

주를 처리하기 위해 주위 funcmap[usergroup]()try..except KeyError 문 를 사용하기를 원하며 설정 방법 수 있습니다 usergroup은 정수 또는 문자열 일 수 있습니다. 문자열을 반환하는 경우 usergroup을 정수로 검색하는 방법에 대해 다른 질문을 할 수 있습니다. 또는, funcmap은 DICT 키와 같은 문자열을 기대 바꿀 수 :

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