Sqlite ile Veri Doğrulması Sonucu Dönen 'None' Değeri Hk

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

*, yani butun kolonlari donduruyor.

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)
2 Beğeni

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ç :smiley:

Aynen hocam sqlite3 zaten ben sqlite adıyla dahil ettim uyuz oldum o 3’e :smiley: 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 :slight_smile:

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.

Gelemez, yanlisin var.

Sifrenin NULL oldugu kolon var mi ki?

…SQL hakkinda en ufak bir sey okudun mu?

Aceleye getirmeye calisirken normalden daha fazla vakit harcamis oldun.

? Nesi yanlis?​​​​​​

Hatırladığım kadarıyla ? karakteri sql in joker karakteri ile karışıyordu. Başıma benzer bir durum gelmişti.

im.execute("""SELECT * FROM staff_management WHERE
               username = """+txtUsername)

şeklinde yapmıştım. Yanlış da hatırlıyor olabilirim ama ? karakterleri ile ilgili where kısmında sorun çıkıyordu.

Joker karakteri?
Escape karakterini mi diyorsun? O \.

Her halukarda, buradaki ? karakteri SQL sorgusuna kadar gitmiyor.

Bu hatali; txtUsername’in SQL ifadesi olmasini bekledigi gibi bu ifadeyi oldugu gibi calistiriyor. Yani yazarina veritabani erisimi vermis oluyor.

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ış!")

Joker karakteri?
Escape karakterini mi diyorsun? O \ .

Hayır sql joker karakteri diyorum. % ve ? joker karakterlerdir.

Haklısın. Tabi ben dışardan gelen veriyi bu şekilde çalıştırmamıştım. Yani dışardan veri almıyordu program içinde kendime özel kullanmıştım sadece.

Hatırladım burada da konusunu açmıştım. Şuydu sorun.