2013-07-06 40 views
2

我們正在創建一個基本的MUD,並希望它從MySQL數據庫中保存/加載,作爲初始命令,我們想要一個初始的「你有角色嗎?」提示時,我們將「否」部分整理出來,併成功保存到數據庫。但是,我在「是」部分遇到問題,更具體地說,它會檢查數據庫中是否存在針對用戶輸入的特定條目以確保其存在,並因此加載數據。MySQL和Python - 如何使用用戶輸入檢查條目?

這裏是我當前的代碼:

global name 
name = '' 
savename = ("INSERT INTO CharactersDB (ID) VALUES (%s)") 
loadname = ("SELECT ID FROM CharactersDB WHERE ID=%s") 

def newname(): 
    global name 
    newchar = raw_input("Do you have a character? (y/n) ") 
    if newchar == 'y': 
     login = raw_input("Please enter your Character's name: ") 
     logincheck = cur.execute(loadname, login) 
     if login == logincheck: 
      print "pass" 
      print "Successfully loaded ", login, "from the database" 

     else: 
      print "Sorry, could not find you in the database" 
      print "Or it just isn't working" 

    else: 
     name = raw_input("Please enter a new name: ") 
     #save new name to the database 
     cur.execute(savename, name) 
     print "Name saved, you are now called ", name 
     db.commit() 
     return name 

newname() 

我沒有任何錯誤,它只是從第一個進入if語句的第二個,省「新」名稱(雖然沒有任何修改,提出db已有條目)

回答

1

符合DB API返回值cur.execute未定義。所以,如果你使用

logincheck = cur.execute(loadname, login) 

那麼你的代碼將依賴於你的數據庫適配器的特定行爲。例如,MySQLdb返回所選行的主鍵(如果存在),或者如果沒有這樣的行,則返回0L。不過,我認爲最好不要依賴這個。

如果您僅僅堅持DB API所保證的行爲,那麼您的代碼將會更通用一些。

相反,你可以使用

cur.execute(loadname, login) 
logincheck = cur.fetchone() 

這將使logincheck一個元組(如果行存在)或價值None。 如果loginCharactersDB中的ID,則logincheck將看起來像組元(login,),而不是字符串login。 如果login不是ID,那麼logincheck將爲無。

所以if-statement可以再這個樣子:

if logincheck is None: 
    print("Sorry, could not find you in the database\nOr it just isn't working") 
else: 
    print("pass\nSuccessfully loaded {} from the database".format(login)) 
+0

對不起,壓痕是我的錯與間距不正確時我將代碼粘貼。但是,謝謝!我會立即嘗試 – mathieu

+0

我想這是一個愚蠢的問題(我們對編程通常還是一個新問題),但是用新的if語句,它是如何檢查logincheck的? – mathieu

+0

糟糕,我的錯誤。它應該是'如果logincheck是None',而不是'如果login是None'。 – unutbu