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 🙂

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.

  • Ist sqlite caching die Ergebnisse der Abfrage für die Optimierung?
  • Bestimmen Sie die maximale Anzahl von Spalten aus sqlite3
  • SQLite 3: sqlite InterfaceError: Fehlerbindungsparameter 0 - wahrscheinlich nicht unterstützter Typ
  • Sqlite3 ist nicht in der Lage, in Python 3 zu importieren
  • SQLite-Parametersatz und Zitate
  • Mit "executemany" können Sie Einträge in einer vorhandenen SQLite3-Datenbank aktualisieren (mit Python sqlite3)
  • Programmierfehler: Falsche Anzahl der gelieferten Bindungen
  • Holen Sie sich eine Liste von Feldwerten aus Python's sqlite3, nicht Tupel, die Zeilen darstellen
  • Python ist die beste Programmiersprache der Welt.