Değerli üstatlar merhaba, sqlite ile bir veri doğrulaması yapmak istiyorum ancak bir yerde takıldım. Çok büyük olasıkla ben bu kısmı yanlış öğrendim ve yardımınıza ihtiyacım var Şimdiden teşekkür ederim.
Konuya kısaca gelirsek ; Kullanıcı adı ve şifre eğer doğruysa doğal olarak True sonucunu almak istiyorum gelen bu True ile koşul ifadesi kullanarak bir takım işlemler yapacağım. Ama ben True beklerken bana dönen “None”. Neden ?
Kodlarım :
# TODO: Don't forget here, there will be a password query online // GERİ GEL BURAYI TAMAMEN GÜVENLİ HALE GETİR. + Admin şifre için Ayrı kontrol sınıfı oluştur.
def loginFunction(self):
data = sqlite.connect('zyro.db')
im = data.cursor()
txtUsername = self.tboxUserName.text() # Test
txtPassword = self.tboxPassword.text() # Test
im.execute("""SELECT * FROM staff_management WHERE
username = ? AND password = ?""", (txtUsername, txtPassword))
login = im.fetchone()
print("Login durumu : " + str(login))
if login:
self.lblLoginSuccess.setText("(TEST-147)Bilgiler doğrulandı, giriş sağlanıyor.")
time.sleep(5)
self.WaitingPanel()
else:
self.lblLoginSuccess.setText("(TEST-148-A)Bilgilerinizi tekrar kontrol edin...")
Yani veritabanında sorguladığım satır boş değil ve veriyle eşleşiyorsa; im.fetchone() ‘True’ döndürmüyor mu :S
WHERE’siz SELECT * FROM table yapip butun satirlari dondurmeyi denedin mi?
Muhtemelen tablo bos. Oyleyse olasi sebebini sqlite3 modulunun dokumentasyonunun ilk orneginde bulabilirsin.
sqlite modulu nedir bilmiyorum ama sqlite3 kullanman lazim.
Bi de database’i halletmeden GUI’ye filan girismissin, iki seyi birden calistirmaya calisiyorsun. Kodu parca parca yazmaya calismazsan cok fazla ilerleyemezsin:
import sqlite3
data = sqlite3.connect('zyro.db')
def loginFunction(self):
im = data.cursor()
txtUsername = "aib"
txtPassword = "hunter2"
im.execute("""SELECT * FROM staff_management WHERE
username = ? AND password = ?""", (txtUsername, txtPassword))
login = im.fetchone()
print("Login durumu : " + str(login))
#cur = data.cursor()
#cur.execute("CREATE TABLE staff_management (username TEXT, password TEXT)")
#cur.execute("INSERT INTO staff_management (username, password) VALUES (?, ?)", ("aib", "hunter2"))
#cur.close()
loginFunction(None)
Hocam Tabloyu doluda boşta denedim yine aynı sonuç gelmişti. Hatta
SELECT* FROM staff_management WHERE password is NULL
olarak da bir denemek istedim, yine aynıydı sonuç
Aynen hocam sqlite3 zaten ben sqlite adıyla dahil ettim uyuz oldum o 3’e Aib hocam haklısınızda biran önce bir şeyler çıkarmak istiyorum, açıkçası aceleye getirdim olayı. Çok teşekkür ederim değerli yanıtlarınız için
True döndürmez. Tablodan değerleri döndürür demet ve listeler halinde.
Ayrıca
im.execute("""SELECT * FROM staff_management WHERE
username = ? AND password = ?""", (txtUsername, txtPassword))
bu satır da yanlış.
Önerim önce bütün tabloyu döndür ve dönen demetin içinde ara daha kolay.
Yani
SELECT username,password FROM staff_management
şeklinde al tablonun hepsini. Sonra gelen verilerden kullanıcı adı parolaları karşılaştır.
Istihza bölümünde güzel açıklanmış aslında. Şu şekilde yapabilirsin.
im.execute("""SELECT * FROM kullanicilar WHERE
kullanici_adi = '%s' AND parola = '%s'"""%(kull, paro))
#Hatırlarsanız daha önce fetchall() adlı bir metottan
#söz etmiştik. İşte bu fetchone() metodu da ona benzer.
#fetchall() bütün verileri alıyordu, fetchone() ise
#verileri tek tek alır.
data = im.fetchone()
#Eğer data adlı değişken False değilse, yani bu
#değişkenin içinde bir değer varsa kullanıcı adı
#ve parola doğru demektir. Kullanıcıyı içeri alıyoruz.
if data:
print("Programa hoşgeldin {}!".format(data[0]))
#Aksi halde kullanıcıya olumsuz bir mesaj veriyoruz.
else:
print("Parola veya kullanıcı adı yanlış!")