2016-09-19 12 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()には、ラベルまたは文字列リテラルを使用する2つの有効な方法があります。文字列リテラルは、一重引用符または二重引用符で囲まれた文字列です。

newPasswordを引用符で囲まなかったので、Sqliteはラベル、つまり列名であるとみなします。現在のレコードのnewPasswordフィールドの値を検索し、そのフィールドが存在しないためエラーをスローします。

あなたがしたいのは、newPassword python変数の値を引用符で囲みます。ここでは修正されたクエリ文字列は(テストしていません)です。

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

誰かがコメントで言及したように、ユーザの入力に直接データベースを更新することは非常に危険です。データベースインターフェイスは、一般的に、すべての入力を簡単にサニタイズする方法を提供します。多くの一般的な言語のコード例を持つ素晴らしいリソースはBobby Tablesです。 (また、SQLセキュリティの情報をSOに含めることができないと、投票結果が下がる可能性があります)。

+0

これはうまくいく、2番目の質問(私はデータベースを初めて使い慣れている)なぜプログラムを実行するたびにテーブルに値を挿入する必要があるのですか?そこにいるの?それが削除または置換されるまで、値をテーブルに残す方法はありますか? – Shniper

+0

データを削除しない限り、そこにデータが存在しない理由はありません。チャンスは、あなたがそれを問い合わせる方法で何らかの間違いをしているということです。あなたのコードは 'info'テーブルにどのフィールドがあるのか​​を表示しません。テーブルに自動インクリメントインデックスフィールドを設定して、何があっても(つまり、2人のユーザーが同じパスワードを使用していても)すべての行を一意に識別できるようにすることをおすすめします。 –

+0

これは、SQLインジェクション攻撃の可能性を開きます。 sqliteは[パラメータ化された文](https://docs.python.org/2/library/sqlite3.html)をサポートしています。 –

関連する問題