mysqldb-python中的检查答案方法

时间:2012-08-23 20:38:11

标签: mysql-python

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

1 个答案:

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