2017-02-02 3 views
0

Im, используя входы от SQLite3 в python 3.5 для добавления информации о пользователях в базу данных. Однако, как только я получу данные и вставляю их в базу данных, вместо того, чтобы вставлять данные в столбцы, он говорит мне, что нет столбца. Я получаю ошибку следующим образом:Вставка значений в sqlite 3, но отображаемых как имена столбцов

Исключение в Tkinter обратного вызова TraceBack (самый последний вызов последнего):

File "C:\Users\Luke_2\AppData\Local\Programs\Python\Python35-32\lib\tkinter__init__.py", line 1549, in call return self.func(*args) File "C:\Users\Luke_2\Desktop\Computing\Coursework\live\current.py", line 303, in details cur_user.execute("INSERT INTO LogIn(Email,Password) VALUES("+user+","+passw+")") sqlite3.OperationalError: no such column: a

И функции в моем коде делать это следующим образом:

def details(): 
    user = email_sign.get() 
    user1 = email1_sign.get() 
    passw = password_sign.get() 
    password1 = password1_sign.get() 
    if user == user1 and passw == password1: 
     cur_user.execute("INSERT INTO LogIn(Email,Password) VALUES("+user+","+passw+")") 
     conn_user.commit() 

    else: 
     print("please try again") 
+0

Попробуйте эту строку: cur_user.execute ("INSERT INTO LogIn (e-mail, Пароль) VALUES ('% s', '% s') "% (пользователь, passw)) –

+0

@DenisV отлично, спасибо – HalfIrish

+0

@DenisV это далеко не идеальный, потому что все еще подвержен SQL-инъекции ... –

ответ

3

Это потому, что запрос, который вы фактически выполняете, не содержит кавычек вокруг значений, поэтому имена интерпретируются как имена столбцов, а SQL-движок. Если вы передаете a и b соответственно вы будете выполнять

INSERT INTO LogIn(Email,Password) VALUES(a,b) 

когда то, что требуется, это

INSERT INTO LogIn(Email,Password) VALUES('a','b') 

Но вы должны никогда к этому! Запросы на строительство в этом случае, но hardcoding параметры в запросе были причиной проблем SQL injection на протяжении десятилетий.

Правильный путь для создания параметризованного запроса:

cur_user.execute("INSERT INTO LogIn(Email,Password) VALUES(?,?)", (user, password)) 

проще, умнее и невосприимчив к SQL инъекции ...

Смежные вопросы