Sqlite3: schaun ob der eingegebene Username vorhanden ist

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
MupfSpace
User
Beiträge: 169
Registriert: Montag 25. Dezember 2017, 20:26

Hallo

Ich Bin gerade dabei mit Python ein Spiel zu programmieren und bin beim Login

Ich habe nun eine Registrierungs Funktion programmiert wo Benutzername und Passwort in eine Sqlite Datenbank im einer Tabelle(Users) abgespeichert wird

Nun möchte ich nachdem man im Login bildschirm den username angegeben hat überprüfen ob der Benutzername überhaupt in der Tabelle(Users) existiert

Ich wehre sehr dankbar wenn mir jemand helfen könnte
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du ein Grundlagentutorial zu SQL durchgearbeitet? Wenn du eine Datenbank nutzen willst, wirst du dich wenigstens ein bisschen damit beschaeftigen muessen. Wir helfen gerne deine Tabellen-Struktur und Abfragen zu pruefen, aber DB-Design frei Haus gibt's eher nicht.
MupfSpace
User
Beiträge: 169
Registriert: Montag 25. Dezember 2017, 20:26

Ja
Ich habe ein tutorial durcharbeitet

Habe aber nichts zu Überprüfungen gefunden
Und deshalb beschlossen zuerst die Registrierung zu machen.

Hättest du vielleicht eine seite wo was dazu drin steht und könntest du mir einen Link geben
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich glaube nicht, dass du ein Tutorial findest, das genau beschreibt, was du willst.

Weisst du, wie du Daten in eine SQL Tabelle bekommst?
Weisst du, wie du Daten aus einer Tabelle abfragst?
Weisst du, wie du Daten aus einer Tabelle abfragst unter einer Bedingung (Stichwort: WHERE)?
MupfSpace
User
Beiträge: 169
Registriert: Montag 25. Dezember 2017, 20:26

Weisst du, wie du Daten in eine SQL Tabelle bekommst?: ja

Weisst du, wie du Daten aus einer Tabelle abfragst?
: ein bisschen

Weisst du, wie du Daten aus einer Tabelle abfragst unter einer Bedingung (Stichwort: WHERE)?: ich glaube WHERE verwendet mann als WENN aber nicht Wenn im Sinne von if sondern eher wenn blablblabla = ? Ist um es später zu bestimmen
MupfSpace
User
Beiträge: 169
Registriert: Montag 25. Dezember 2017, 20:26

Ich habe mich glaubich bei punkt3 etwas falsch ausgedrückt

Ich meinte eher: in diesem Falle ist
Sirius3
User
Beiträge: 17753
Registriert: Sonntag 21. Oktober 2012, 17:20

@MupfSpace: und wie sähe dann so eine Abfrage aus, bei der Du die User-Tabelle fragst, ob es einen User mit einem bestimmten Namen gibt?
MupfSpace
User
Beiträge: 169
Registriert: Montag 25. Dezember 2017, 20:26

Das ist jezt nur eine ide zu der ich nachher noch eine Frage habe

try:
...
sql="SELECT Username FROM Users WEHRE Username = Variable"
...
except:
print (" Der Username ist nicht vorhanden bitte Registriere dich erst")

Aber wie mache ich das mit der variable in dem SQL code?
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

Hallo,


wenn du dein SQL Statement so ausführst wird folgender Fehler kommen:

[codebox=mysql file=Unbenannt.sql]
SELECT Username FROM Users WEHRE Username = User1;
#1054 - Unknown column 'User1' in 'where clause'
[/code]
Mysql hält deinen User1 für eine Spalte. Also müssen noch " mit in den String.

Wie macht man das denn in Python mit Variablen?
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Fuer die Variable brauchst du einen Platzhalter.

Code: Alles auswählen

cursor.execute("SELECT password FROM users WHERE name = ?", (benutzername,))
MupfSpace
User
Beiträge: 169
Registriert: Montag 25. Dezember 2017, 20:26

Und das ? Ist dann das was in der Klammer Benutzername ist oder?
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja. Darum heisst es ja so :K
MupfSpace
User
Beiträge: 169
Registriert: Montag 25. Dezember 2017, 20:26

Habe das jezt so gemacht

Code: Alles auswählen

def testUsername(self, username, password, User):
        assert(isinstance(username,str))
        assert(isinstance(password,str))
        assert(isinstance(User,str))
        try:
            self.cursor.execute("SELECT password FROM Users WHERE Username =?"(User))
            self.conn.commit()
        except:
            print("Username ist nicht vorhanden")
Aber ich bekomme immer Username ist nicht vorhanden obwohl ich in der daten Bank hinzugefügt habe :K
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das liegt daran, das du etwas tust, das man NIEMALS tun sollte, ausser man weiss, was man macht:

Code: Alles auswählen

try:
   ...
except: # OHNE KONKRETE EXCEPTION ALLES ABFANGEN!


Ohne das man einen vernuenftige Fehlerbehandlung macht verdeckt ein solches all-umfassendes abfangen von Fehlern auch Programmierfehler. Und du hast davon mindestens zwei. Schau mal auf die Kommas die ich verwende, und wo ich die verwende, und wo du die machst. Und da kommt ein Fehler bei rum.

Das ganze kann man auch *OHNE* try/except (selbst ein vernuenftiges) schreiben, weil die DB eben nix zurueckliefert, wenn sie den Namen nicht kennt. Also schmeiss das try/except raus, und reparier die Bugs, und dann pruef ueber die Anzahl der gelieferten Ergebnisse welchen Fall du hast.
Sirius3
User
Beiträge: 17753
Registriert: Sonntag 21. Oktober 2012, 17:20

@MupfSpace: der Fehler ist, dass man NIEMALS nackte excepts benutzen darf, weil man damit auch etliche Programmierfehler abfängt, wie hier z.B. dass ein String nicht aufrufbar ist. Das Exception-Handling ist hier sowieso unsinnig, weil ein SELECT der kein Ergebnis liefert, kein Fehler ist, sondern einfach nur kein Ergebnis liefert, wenn man es denn abfragen würde. Ein `commit` bei einem SELECT ist auch unsinnig. `assert` ist ein Keyword und keine Funktion, daher sind die Klammern überflüssig. Laß auch gleich die assets alle weg. Wenn man in Python einen nicht verwendbaren Datentyp hat, dann wird an entsprechender Stelle ein Fehler geworfen. Auf der anderen Seite muß nicht alles exakt den Datentyp haben, den Du hier abfragst.

Was ist der Unterschied zwischen `username` und `User`?
MupfSpace
User
Beiträge: 169
Registriert: Montag 25. Dezember 2017, 20:26

Aber wie soll ich ohne Try/Except herausfinden ob es in der Tabelle steht?
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Habe ich dir doch schon geschrieben. Wenn du keine Ergebnisse bekommst, dann hat die Datenbank deinen Benutzer nicht bekommen. Dazu hat ein cursor das Attribut "rowcount"

Code: Alles auswählen

cursor.execute(...)
if cursor.rowcount:
    # hast einen user
else:
   # hast keinen
Sirius3
User
Beiträge: 17753
Registriert: Sonntag 21. Oktober 2012, 17:20

@__deets__: `rowcount` funktioniert nur mit UPDATE/INSERT und gibt die Anzahl der geänderten Einträge an. Bei SELECT funktioniert das nicht, weil die DB im Normalfall erst die Ergebnisse liefert, wenn man sie auch abfragt.

@MupfSpace: man fragt die Datenbank ab, und wenn kein Ergebnis kommt, existiert der User nicht.
MupfSpace
User
Beiträge: 169
Registriert: Montag 25. Dezember 2017, 20:26

@__deets__
Danke

Hat soweit gut funktioniert wenn der user vorhanden ist macht er das was ich wollte.

Bloß wenn der user nicht vorhanden ist macht er gar nichts anstelle von dem was bei else steht
Zuletzt geändert von MupfSpace am Mittwoch 4. April 2018, 12:17, insgesamt 1-mal geändert.
MupfSpace
User
Beiträge: 169
Registriert: Montag 25. Dezember 2017, 20:26

@sirius3 also doch mit try/except
Antworten