0

入力ボックス ウィジェットへのユーザー入力を mysqld の値と照合してチェックし、メッセージ ボックスにメッセージを表示して、彼の答えが正しいか間違っているかを伝えたいと考えています。例として、名前と電話番号を含むデータベースがあります。ユーザーが特定の名前に対して正しい電話番号を入力すると、メッセージ ボックスに「あなたは正しい」と表示されます。そうでなければ「あなたは間違っている」。名前と電話番号は mysqld データベースにあります。そのため、ユーザーには入力ボックスの 1 つに名前だけが表示され、もう 1 つの入力ボックスは空になり、電話番号を入力できます。手伝ってくれませんか。

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Execute the SQL command
cursor.execute("SELECT * FROM PHONES")

# Fetch all the rows in a list of lists
row0 = cursor.fetchone()[0]
row1 = cursor.fetchone()[1]
row2 = cursor.fetchone()[2]

#checking the values in a single row
if row1 == nameVar.get() and row2 == phoneVar.get():

    tkMessageBox.showinfo("MCPHS Alpha Brand & Generic","You are right.") 

elif row1 != nameVar.get() and row2 != phoneVar.get():

    tkMessageBox.showerror("Check answer","Wrong answer")
else:

    tkMessageBox.showerror("Check answer","Enter an answer")


# disconnect from server
db.close()    

そして、私はこのようにメソッドを呼び出します

  b7 = Button(frame2,text="Check Answer",command=checkAnswer)
4

1 に答える 1

0

cursor.fetchone()使い方を間違っているようです。単一の行、つまり列値のタプルを返しますNoneが、結果セットにそれ以上行がない場合は返されます。列の値を取得しようとしているようですがfetchone()、複数回呼び出しているため、各行から異なる列を取得しています。

あなたの SQL クエリSELECT * FROM PHONESには欠陥があります: WHERE 句がないため、テーブル内のすべての行が選択されますが、これはおそらく望んでいるものではありません。記号を使用することにより*、読者はどの列が返されているかを正確に知ることができません。予期しない順序で返される場合があります。私はあなたがこのようなものが欲しいと推測するつもりです:

name = nameVar.get()
cursor.execute("SELECT phone from PHONES WHERE name=%s", (name,))
row = cursor.fetchone()
if not row:
    # row matching name not found
    break
phone = row[0]
# compare to submitted values

COUNT()または、次の SQL関数を使用できます。

name = nameVar.get()
phone = phoneVar.get()
cursor.execute("SELECT COUNT(*) FROM PHONES WHERE name=%s and phone=%s", (name, phone))
count = cursor.fetchone()[0] # this query should always return exactly one row
if count:
    # data matched
else: 
    # it didn't match
于 2012-09-21T20:47:31.213 に答える