我想根据mysqld值检查用户输入到一个输入框小部件,并在消息框中输出一个消息,说明他的答案是对还是错。一个例子可以是带有姓名和电话号码的数据库;如果用户输入给定名称的正确电话号码,则消息框显示“您是对的”。否则“你错了”。名称和电话号码在mysqld数据库中。因此,用户只能看到其中一个输入框中的名称,而另一个输入框将为空以便输入电话号码。你能帮我吗?
# 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)
答案 0 :(得分: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
或者,您可以使用SQL COUNT()
函数:
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