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 🙂

  • Fehlerbindungsparameter 0: wahrscheinlich nicht unterstützter Typ
  • Python SQLite - Wie man manuell BEGINNEN und END-Transaktionen?
  • Extrahieren von Werten aus der SQLite-Datenbank in Python
  • Einfachste Weg, um SQLite-Abfrage zu wiederholen, wenn DB gesperrt ist?
  • Verwenden Sie mehrere Cursor in einer verschachtelten Schleife in sqlite3 von python-2.7
  • SQLite-Datenbank mit Python-Variablen durchsuchen
  • Sqlite3: select top n Datensätze in einer Spalte
  • Sharing a: memory: datenbank zwischen verschiedenen threads in python mit sqlite3 package
  • 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.