2013-04-20 94 views
0

我得到這個錯誤,並突出顯示的代碼是 PASSW [0]簡單的密碼校驗類型錯誤:「NoneType」對象有沒有屬性「__getitem__」

這個錯誤是什麼恰恰意味着?這是一個簡單的比較,但它作爲一個元組返回,我無法比較它。我是否需要將密碼更改爲元組?還是我不得不做另一種方式,因爲它出來平等? 這是我的完整代碼。這是一個簡單的密碼檢查。

def check_login(db, useremail, password): 
    """returns True if password matches stored""" 

    cur = db.cursor() 
    password1 = db.crypt(password) 
    ur = "SELECT email FROM users WHERE email = ?" 
    cur.execute(ur, (useremail,)) 
    user = cur.fetchone() 
    if user[0] == useremail: 
     pas = "SELECT password FROM users WHERE email = ? AND password = ?" 
     cur.execute(pas, (useremail, password1,)) 
     passW = cur.fetchone() 
     if passW[0] == password1: 
      return True 
     else: 
      return False 
+0

的方法'當你申請了'__getitem__'被稱爲[]'運算符在一個變量上。這個錯誤意味着,'passW'的類型是'None',並且沒有'__getitem__'方法。我對數據庫沒有任何經驗,但我認爲,無法從數據庫中檢索到該密碼。 – 2013-04-20 11:09:44

+0

您也可能遇到'SELECT email FROM users WHERE email =?'查詢的問題。你可以用單行'return db.cursor()來完成整個函數。query(「SELECT * FROM users WHERE email =?AND password =?」,(useremail,db.crypt(password)))。fetchone()不是無「。 – Aya 2013-04-20 11:24:48

回答

1
passW = cur.fetchone() 

cur.fetchone()回報None當在不匹配。由於您從用戶那裏獲取密碼,並通過該密碼和電子郵件查找密碼,如果密碼不匹配,則不會找到該行。結果,cur.fetchone()返回None。事實上,這樣的:

passW = cur.fetchone() 
if passW[0] == password1: 
    return True 
else: 
    return False 

可能只變成:

return if cur.fetchone() is not None: 
    return True 
return False 

或者像仁雅建議:

return cur.fetchone() is not None 
+1

甚至更​​短: '返回cur.fechone()不是無' – 2013-04-20 11:17:16

+0

呵呵,我不知道爲什麼我沒有這樣做。謝謝!我會更新我的答案。 – jszakmeister 2013-04-20 11:27:56

+0

謝謝傢伙艾雅和你們的建議爲我修復:D – user2294579 2013-04-21 06:43:39

相關問題