2016-09-19 57 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字段的值,並且由於該字段不存在而引發錯誤。

你想要做的是,把newPassword python變量的值放在引號中。這裏有一個修正的查詢字符串(未測試):

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

正如有人在評論中提到,直接與用戶輸入更新你的數據庫是非常不安全的。數據庫接口通常提供簡單的方法來清理所有輸入,並且您應該讓它遵循這些實踐。來自許多流行語言的代碼示例的一個很好的資源是Bobby Tables。 (另請注意,如果在SO中的回答中未包含有關SQL安全性的信息,可能會導致反對票。)

+0

這工作,第二個問題(對不起,我是數據庫的新手)爲什麼我需要插入我的價值到每次我運行該程序的表它在那裏?在刪除或替換之前,是否有辦法將值保留在表中? – Shniper

+0

沒有理由數據不會存在,除非你刪除它。機會是,你在查詢它的方式上犯了某種錯誤。你的代碼不會顯示'info'表中的字段。在表中有一個自動增量索引字段是一個不錯的主意,這樣每行都可以被唯一標識,即使兩個用戶擁有相同的密碼也是如此。 –

+0

這可能會導致SQL注入攻擊。 sqlite支持[參數化語句](https://docs.python.org/2/library/sqlite3.html)。 –