2016-03-18 6 views
-1

こんにちは、私はtkinterで簡単なログインモジュールを作ろうとしています。私は入力ウィジェットを介してユーザから入力を受け取り、 ...しかし、何らかの理由でパスワードdoesntのマッチのために、私はいくつかのテストと、それはdosent試合を試してみました....なぜ文字列はsqlite3データベース(Python)のテキスト値と同じではありません

import sqlite3 
conn=sqlite3.connect('auth_rWebsites.db') 
c=conn.cursor() 

def check_password(key): 
    thePass= c.execute("SELECT pass FROM user_pass") 
    if key == thePass: 
     print("right Password") 
    else: 
     print("Wrong Password") 

rows= c.execute("SELECT * FROM user_pass") 
for row in rows: 

    print row 

check_password("root") 

これは私が書いた上で、簡単なテストコード.. かのループを経由して、データベースのパスワード出力は

(u'root',) 
Wrong Password 

ですので、私はそれを一致させるために何をしなければならないのですか。

答えて

2

thePassは、繰り返し可能です。tuple s、keyは文字列です。

一般に、python db apiは、文で複数のものを選択できるので、データベース行をタプルとして返します。行の戻り値の型(データベースapiと呼び出し元の両方)を決定するためにクエリを調べる必要がある混乱するロジックを持つのではなく、仕様では常にタプルを返すように指定されています。あなたが行を正しく...

rows = c.execute("Select pass FROM user_pass") 
for row in rows: 
    if row[0] == thePass: 
     print("right password") 
     return 
else: 
    print("Wrong Password")  

注意してkeyを比較する必要が

が、これはおそらく、あなたが実際に欲しいものではありません。これは、user_passテーブルの1行にpassという値があることを確認することだけです。それどころか、ユーザー名に対してクエリをフィルタリングし、パスワードを確認したい:

c.execute("SELECT pass FROM user_pass WHERE username = ?", username) 
result = c.fetchone() # username should be unique I assume :-) 
if result[0] == salt_and_hash(key): 
    print("Yeah!") 
else: 
    print("No!") 
3

c.execute("SELECT pass FROM user_pass")はタプルではなく、文字列を返すが、keyは文字列です。 ...私はこれが正しいことを確信していない

def check_password(key): 
    thePass= c.execute("SELECT pass FROM user_pass")[0] # Changed here 
    if key == thePass: 
     print("right Password") 
    else: 
     print("Wrong Password") 
+0

うではない 'c.execute:あなたはタプルから最初の値を取得し、あなたのkey引数にそれを比較するため、これまであなたの関数を変更する必要があります'タプルを返すiterableを返しますか? – mgilson

関連する問題