2016-09-19 3 views
-1

У меня есть система паролей, которая хранит пароль для программы python в таблице SQL. Я хочу, чтобы пользователь мог изменить пароль в окне tkinter, но я не уверен, как использовать значение переменной python в качестве значения для таблицы SQL. Вот пример кода:Вставить значение переменной python в таблицу SQL

import tkinter 
from tkinter import * 
import sqlite3 

conn = sqlite3.connect('testDataBase') 
c = conn.cursor() 

c.execute("INSERT INTO info Values('test')") 
c.execute("SELECT password FROM info") 
password = (c.fetchone()[0]) 

#Window setup 
admin = tkinter.Tk() 
admin.minsize(width=800, height = 600) 
admin.maxsize(width=800, height = 600) 
#GUI 
passwordChangeLabel = Label(admin, text="It is recommended to change your password after first login!", font=("Arial", 14)) 
passwordChangeLabel.pack() 

passwordChangeCurrentPasswordLabel = Label(admin, text="Current Password: ", font=("Arial", 11)) 
passwordChangeCurrentPasswordLabel.place(x=275, y=30) 
passwordChangeCurrentPasswordEntry = Entry(admin) 
passwordChangeCurrentPasswordEntry.place(x=405, y=32.5) 

passwordChangeNewPasswordLabel = Label(admin, text="New Password: ", font=("Arial", 11)) 
passwordChangeNewPasswordLabel.place(x=295, y=50) 
passwordChangeNewPasswordEntry = Entry(admin) 
passwordChangeNewPasswordEntry.place(x=405, y=52.5) 

passwordChangeButton = Button(admin, text="Submit", width=20) 
passwordChangeButton.place(x=350, y=80) 

def changePasswordFunction(event): 
    newPassword = passwordChangeNewPasswordEntry.get() 
    enteredPassword = passwordChangeCurrentPasswordEntry.get() 
    if enteredPassword == password: 
     c.execute("REPLACE INTO info(password) VALUES(newPassword)") 
    else: 
     wrong = tkinter.Toplevel() 
     wrong.minsize(width=200, height = 100) 
     wrong.maxsize(width=200, height = 100) 
     Label(wrong, text="Sorry that password is incorrect!", font=("Arial", 24), anchor=W, wraplength=180, fg="red").pack() 

admin.bind('<Return>', changePasswordFunction) 
passwordChangeButton.bind('<Button-1>', changePasswordFunction) 

Этот код вызовет ошибку:

sqlite3.OperationalError: no such column: newPassword 

Как правильно заменить предыдущее значение в столбце пароля с новым введенным паролем?

+0

Вы прочитали документацию по параметризованным запросам? https://docs.python.org/2/library/sqlite3.html –

ответ

-1

Существует два допустимых способа использования VALUES(): с меткой или строковым литералом. Строковый литерал представляет собой строку в одинарных или двойных кавычках.

Поскольку вы не ставили newPassword в кавычки, Sqlite предполагает, что newPassword является меткой, то есть именем столбца. Он ищет значение поля newPassword в текущей записи и выдает ошибку, поскольку это поле не существует.

Что вы хотите сделать, возьмите значение переменной python newPassword и поместите его в кавычки. Вот исправленная строка запроса (не проверено):

"REPLACE INTO info(password) VALUES('" + newPassword + "')" 

Как кто-то упоминает в комментариях, обновление базы данных непосредственно с вводимыми пользователем крайне небезопасно. Интерфейсы баз данных обычно предоставляют простые способы для дезинфекции всех материалов, и вы должны сделать так, чтобы следовать этим практикам. Отличный ресурс с примерами кода из многих популярных языков - Bobby Tables. (Также обратите внимание, что неспособность включить информацию о безопасности SQL в ваши ответы на SO может привести к понижению голосов.)

+0

Это работает, второй вопрос (извините, я новичок в базах данных). Почему мне нужно вставлять мое значение в таблицу каждый раз, когда я запускаю программу для он должен быть там? Есть ли способ, чтобы значение оставалось в таблице до тех пор, пока оно не будет удалено или не заменено? – Shniper

+0

Нет причин, чтобы данных не было, если вы не удалили их. Скорее всего, вы делаете какую-то ошибку в том, как вы ее запрашиваете. Ваш код не показывает, какие поля находятся в таблице 'info'. Рекомендуется иметь поле индекса автоматического увеличения в вашей таблице, так что каждая строка может быть однозначно идентифицирована независимо от того, что (например, даже если у двух пользователей одинаковый пароль). –

+0

Это открывает возможность атаки на SQL-инъекцию. sqlite поддерживает [параметризованные утверждения] (https://docs.python.org/2/library/sqlite3.html). –

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