2017-10-20 3 views
0

python 3.6 용으로 죽은 간단한 로그인 및 등록 스크립트를 작성하려고합니다. 그러나, 나는이 버그를 없앨 수 없다. 내가 등록 할 때마다 오류가 없다. 그러나 내가 다시 실행하고 같은 사용자 이름을 사용할 때 이미 존재하는 메시지를 표시하지 않는다 ... 실제로 코드를 실행하지 않고 ... 너무 너무 내가SQLite 3/Python3.6 - 등록 및 로그인 스크립트 (sql 및 python 처음)

여기 코드입니다 (c.fetchall() 사용) 거기에 무엇을 볼 수있는 전체 DB 출력에 당신은 fetchall() 실행중인

import sqlite3 as sql, os 

def dirCheck(): 

    exDir=False 

    for count in os.listdir(): 
     if count == 'sql': 
      exDir=True 
    if exDir == False: 
     os.mkdir('sql') 



dirCheck() 


cnct=sql.connect('./sql/usrAcc.db') 
c=cnct.cursor() 


def newTable(): 
    c.execute('CREATE TABLE IF NOT EXISTS users(username TEXT, password TEXT)') 


newTable() 

f=False 
t=True 
valid=f 
taken=f 





def credsWrite(username, password): 
    c.execute('INSERT INTO users(username, password) VALUES (?, ?)', 
       (username, password)) 
    cnct.commit() 
    for row in c.fetchall(): 
     print(row) 
    c.close 
    cnct.close 



def userReg(): 
    global valid, taken 

    print(fancy[1]) 
    while not valid: 
     print(fancy[3]) 
     username=str(input('>> ')) 
     for row in c.fetchall(): 
      if str(username) == str(row[0]): 
       print('Sorry, but that username has already been taken...\nPlease enter another\n> ') 
       taken=True 
     if not taken: 
      print(fancy[4]) 
      password=str(input('>> ')) 
      valid=True 
     credsWrite(username,password) 

fancy=[""" 
================ 
| SQL LOGIN TEST | 
================ 
""",""" 
========== 
| REGISTER | 
========== 
""",""" 
======= 
| LOGIN | 
======= 
""",""" 
================ 
| ENTER USERNAME | 
================ 
""",""" 
================ 
| ENTER PASSWORD | 
================ 
"""] 


def startUp(): 
    print(fancy[0]) 
    chosen=False 
    while not chosen: 
     opt=int(input('\n Please choose one of the options below:\n\n-> Register for a new account [1]\n-> Login to an existing account [2]\n\nPlease type a number...\n\n>> ')) 
     if opt==1: 
      userReg() 
      chosen=True 
     elif opt==2: 
      login() 
      chosen=True 
     else: 
      print('\n\nPLEASE TYPE EITHER 1 OR 2...\n ') 


if __name__ == "__main__": 
    startUp() 

답변

0

그것을 얻을 질수 .

당신은 아직 아무것도보고하지 않은 단지 커서 객체를 통해 찾고있다

for row in c.fetchall(): 

이 곳.

fetchall을 사용하려면 SELECT 문을 추가해야합니다. 예를 들어, 내가 한 줄을 추가하고 한 줄을 변경하여 코드를 변경하고 그것을 실행 (발생하는 다른 구문 오류가 비록) :

all_users = c.execute('SELECT * FROM users') 
for row in all_users.fetchall(): 

(다른 구문 오류가 당신이 상관없이 creds를 작성하려고하는 것을 여부의 사용자 이름이 유효)


참고 :. 뭔가 다른 고려해야 :

대신 그냥 사용자 이름이 이미 SQL에 있는지 여부를 검색 할 수 fetchall의 결과를 통해 반복의

. 그러면 다음 부분도 else이됩니다.

username=str(input('>> ')) 
taken = c.execute('SELECT username FROM users WHERE username=?', (username,)) 
if taken: 
    print('Sorry, but that username has already been taken...\nPlease enter another\n> ') 

(username,)

합니다 ( python docs for sqlite3 초기 설명) 파라미터이다. SQL injection을 피하기 위해 사용자의 값을 사용할 때는 항상 매개 변수를 사용해야합니다. 튜플로 만들기 위해 괄호 안에 쉼표가 있습니다.