0

我想根据 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)
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

或者,您可以使用 SQLCOUNT()函数:

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 回答