Python Sqlite3 Datenbanktabelle wird nicht aktualisiert

Ich schaffe eine Change-Passwort-Seite für eine Website, die das neue Passwort und das aktuelle Passwort anfordert. Das alte Passwort wird mit der Scrypt-Bibliothek gehasht und gesalzen, verglichen mit dem in der sqlite3-Datenbank gespeicherten Passwort, und wenn es sich um eine Übereinstimmung handelt, wird das neue Passwort gehasht und die Datenbank aktualisiert. Allerdings habe ich Schwierigkeiten, den Update-Befehl auszuführen, da er ein sqlite3.OperationalError: unerkanntes Token auslöst: "\" Fehler. Die Execute-Anweisung hat derzeit den folgenden Code:

c.execute("UPDATE users SET password = \'{0}\' WHERE memberID = \'{1}\'".format(newPas, memID)) 

Zuerst glaubten wir, dass dieser Fehler durch die Verwendung von 'in der String-Formatierung aufgrund der Anwesenheit von' innerhalb des neuen Passwortes selbst verursacht wurde, so dass dies wieder als:

 c.execute("UPDATE users SET password = \"{0}\" WHERE memberID = \"{1}\"".format(newPas, memID)) 

Das läuft erfolgreich ab, ändert aber nichts in der Datenbank. Wir haben auch versucht, einen Abfrage-String zu erstellen und dann den String auszuführen.

 query = "UPDATE users SET password = {0} WHERE memberID = {1}".format(newPas, memID) c.execute(query) 

Dies führte zu einem sqlite3.OperationalError: nahe "'\ xa1 \ x91 \ x9f \ x88 \ xfb \ x81 \ x12 \ xd4 \ xc2 \ xf9 \ xce \ x91y \ xf0 / \ xe1 * # \ x8aj \ xc7 \ x1d \ xd3 \ X91 \ xx \ xcb \ xa4 \ xabaP [\ x02 \ x1d \ x1b \ xabr \ xc7 \ xe4 \ xe \ x19 \ xxc \ x8e \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Xc6 \ x84 [\ xfb \ xbc \ x8d \ xfc '": Syntaxfehler. Ich glaube, dass dies durch die Anwesenheit von "und" Zeichen innerhalb des Passworts verursacht wird, aber ich bin mir nicht sicher, wie man dieses Problem umgibt, da diese durch den Hash-Prozess hinzugefügt werden und damit das Entfernen von ihnen das Passwort ändern würde. Das Passwort, das ich möchte Hinzuzufügen ist:

 b'\xa1\x91\x9f\x88\xfb\x81\x12\xd4\xc2\xf9\xce\x91y\xf0/\xe1*#\x8aj\xc7\x1d\xd3\x91\x14\xcb\xa4\xabaP[\x02\x1d\x1b\xabr\xc7\xe4\xee\x19\x80c\x8e|\xc0S\xaaX\xc6\x04\xab\x08\x9b\x8e\xd7zB\xc6\x84[\xfb\xbc\x8d\xfc' 

Ich frage mich, ob jemand einige Einblicke darüber teilen könnte, warum es nicht den "\" Charakter mag oder warum es nicht die Datenbank aktualisiert, und zeigen Sie mir in die richtige Richtung, um es zu arbeiten. Wenn Sie mehr Informationen oder Code-Snippets benötigen oder einfach nur an mir schreien wollen, bitte zögern Sie nicht! Vielen Dank im Voraus 🙂

  • Python 3.2 UnicodeEncodeError: 'charmap' codec kann das Zeichen '\ u2013' nicht in Position 9629 kodieren: Zeichenkarten zu <undefined>
  • Einrichten der Konfiguration der sqlite3-Datenbank in Python SQLITE_CONFIG_MULTITHREAD
  • Python SQL-Funktion, Abfrage, um Daten nach Minuten zu gruppieren
  • Wie lese ich datetime zurück von sqlite als datetime anstelle von string in Python?
  • Wie erstelle ich eine SELECT-Anweisung mit einer Liste als Parameter?
  • Tweepy Stream zu sqlite Datenbank - ungültige Synathe
  • Profil Millionen von Textdateien im Parallel mit einem Sqlite Counter?
  • Pycharm-Umgebung anders als Kommandozeile
  • 2 Solutions collect form web for “Python Sqlite3 Datenbanktabelle wird nicht aktualisiert”

    Ein paar Dinge mit deinem Code:

    1. Sie sollten das format nicht verwenden, um Ihre Abfragen so zu erstellen. Dies lässt Sie haftbar zu SQL-Injektion und, während Sie Ihre Eingaben in diesem Fall zu sanieren können, ist es eine schlechte Angewohnheit, die Sie beißen wird.
    2. Alle Änderungen müssen an die Datenbank gebunden werden, um tatsächlich wirksam zu werden. Aus diesem Grund hat deine zweite Abfrage keinen Fehler ausgelöst, aber auch keine Änderungen an der Datenbank vorgenommen.

    Die korrekte Formatierung dieser Abfrage wäre:

     conn = sqlite3.connect('my_db.db') c = conn.cursor() query = "UPDATE users SET password = ? WHERE memberID = ?" c.execute(query, (newPas, memID)) conn.commit() # To finalise the alteration 

    Als Nebennote erwartet der Cursor in diesem Fall ein Tupel, so dass bei der Übergabe einzelner Werte ein gemeinsamer Stolperstein kommt:

     query = "UPDATE users SET password = ? WHERE memberID = 'abc'" c.execute(query, (newPas)) # Throws "incorrect number of bindings" error # Use this instead ie pass single value as a tuple c.execute(query, (newPas,)) 

    Sie können das format , um variable Feldnamen in einer Abfrage zu erstellen, da Platzhalter in diesem Fall nicht erlaubt sind:

     fields = ['a', 'b', 'c'] query = "UPDATE users SET {} = ?".format(random.choice(fields)) 

    Zusätzlich zu verwenden, um Ihnen zu helfen, große Abfragen zu bauen, wo es mühsam wäre, manuell alle Platzhalter zu schreiben und schwer zu stellen, dass Sie die richtige Nummer hatten, wenn sich Ihr Code geändert hat:

     my_list = ['a', 'b',...., n] placeholders = ', '.join(['?' for item in my_list]) query = "INSERT .... VALUES = ({})".format(placeholders) 

    Sie sollten parametrisierte Abfragen so etwas verwenden:

    C.execute ("" "UPDATE-Benutzer SET password =? WHERE memberID =?;" "" (NewPas, memID))

    Es wird erlauben, böse Dinge wie SQL-Injektionen zu vermeiden.

    Python ist die beste Programmiersprache der Welt.