0%

Daten sicher ändern · Abschlussprojekt

Abschlussprojekt: Projekt: Sichere Änderungsfunktionen für Mitglieder bauen

Die Mitgliedertabelle braucht dieselben sorgfältigen Operationen, die du für Gegenstände gebaut hast. Dieses Mal wählst du alle vier Anweisungen und Parameterzuordnungen selbst und verwendest Mitgliederfelder, statt gegenstandsspezifische Namen oder Positionen zu kopieren.

Jede Mitgliederzeile hat genau diese Reihenfolge:

PositionSpalteBeispielwert
1id13
2member_code"M'50"
3name"Ari O'Neil"
4loan_limit2.5

Öffne member_changes.py. Die Datei enthält vier Funktionsdefinitionen. Behalte ihre Namen und Argumente bei und gib jeder dieses Verhalten:

  • find_member(connection, member_code) wählt id, member_code, name, loan_limit für einen gebundenen Code aus und gibt .fetchone() zurück.

  • add_member(connection, member) fügt die vier ausdrücklich genannten Spalten mit vier Platzhaltern ein und gibt den unmittelbaren rowcount des Einfügecursors zurück.

  • change_loan_limit(connection, member_code, loan_limit) aktualisiert loan_limit, wo der gebundene Code passt. Seine Werte sind (loan_limit, member_code), und es gibt unmittelbar rowcount zurück.

  • remove_member(connection, member_code) löscht, wo der gebundene Code passt, und gibt unmittelbar rowcount zurück.

Schreibe in jede Funktion eine feste Anweisung in dreifachen Anführungszeichen und rufe dann connection.execute(statement, values) über die übergebene offene Verbindung auf. Öffne, schließe oder ersetze diese Verbindung nicht.

Eine nützliche Reihenfolge ist Suchen, Einfügen, Aktualisieren und dann Löschen. Die vier Parametertupel ergeben sich dann ganz natürlich aus dem, was du bereits weißt:

FunktionNeben der Anweisung übergebene Werte
find_member(member_code,)
add_membermember
change_loan_limit(loan_limit, member_code)
remove_member(member_code,)

Bei einem Code wie "M'50" bleibt der Apostroph in jedem Fall innerhalb des Python-Wertes. Er wird nie Teil des SQL-Textes, also verwenden Suchen, Ändern und Entfernen dieses Mitglieds dieselbe sichere Grenze.

Run zeigt eine vollständige Abfolge mit konkreten Aufrufen. Es findet Riley und ruft dann auf:

add_member(connection, (13, "M'50", "Ari O'Neil", 2.5))
change_loan_limit(connection, "M'50", 4.5)
remove_member(connection, "M'50")

Die erwarteten Rückgabewerte sind 1, 1 und 1. Suchen davor und danach zeigen das vollständige Tupel, sein geändertes Limit und schließlich None. Dieselbe offene Verbindung trägt jede Beobachtung.

Der Durchlauf verwendet auch "X' OR 1=1 --" als fehlenden Code. Beide Änderungsfunktionen sollten 0 zurückgeben, und Sams Zeile M-23 muss unverändert bleiben. Behalte jeden vollständigen Code als gebundenen Wert bei.

Submit prüft jede Funktion einzeln und in einer Abfolge mit unbekannten IDs, Namen, Apostrophen, SQL-ähnlichem Text und positiven Limits mit und ohne Nachkommastellen. Die bestehenden Tabellenregeln dürfen bei doppelten IDs, doppelten Codes oder ungültigen Limits ihren normalen Datenbankfehler auslösen. Verberge diese Fehler nicht und benenne sie nicht um.

Arbeite jeweils an einer Funktion. Mache zuerst ihren gewöhnlichen Fall sichtbar, prüfe dann den fehlenden oder verdächtig aussehenden Wert und gehe erst danach weiter. Das fertige Modul gibt der Mitgliederseite des Verleihprojekts dieselben gezielten, beobachtbaren und sicher gebundenen Änderungen wie der Gegenstandsseite.

Aufgabe

Implementiere alle vier Funktionen in member_changes.py mit festem SQL und separaten gebundenen Werten. Gib aus find_member ein Tupel oder None zurück und aus Einfügen, Aktualisieren und Entfernen unmittelbar ganzzahlige Zeilenanzahlen.

Führe die vollständige Mitgliederabfolge aus, prüfe die unveränderte Nachbarzeile und reiche das Modul ein.