Seite 1 von 1

CGI-Skript: string index out of range

Verfasst: Donnerstag 13. Januar 2005, 21:11
von bmh1980
Hallo.

Da ich das Kapitel über CGI-Programmierung in meinem Python-Buch bisher nicht angerührt habe, dachte ich mir, dass es mal Zeit wird.

Bisher hat auch alles wunderbar geklappt und in meinem Übermut kam ich noch auf die Idee mal mit anydbm eine Datenbank mit ein zu binden.

Und siehe da, das erste Problem taucht auf.

Über ein Eingabeformular werden Daten in der Datenbank gespeichert. Was auch funktioniert. Ein weiteres Skript fragt die Datenbank ab und überprüft die dortigen Einträge.

Code: Alles auswählen

for key in db.keys():
    line = db[key].split('|')
    for row in line:
        if row[7] == 'n':
Das ist der Abschnitt, der den im Titel genannten Fehler ausgibt.

Wenn ich das Skript aber direkt in der Konsole abarbeite (ohne die print-Anweisungen), dann funktioniert alles.

Wie kann das sein? An den Funktionen ändert sich doch nichts. Oder doch?

Verfasst: Donnerstag 13. Januar 2005, 21:17
von Milan
Hi. Wie der Fehler entsteht liegt allein daran, was in db vorhanden ist. Deswegen ist es ja auch nicht dasselbe, das Script in der Konsole auszuführen. Bei irgendeinem Eintrag wird dann das row[7] eine Fehler schießen, da row gar nicht 8 Zeichen lang ist. Das hat mit der Funktion nix zu tun, sondern mit den Daten mit denen sie gefüttert wird.

Verfasst: Donnerstag 13. Januar 2005, 21:27
von Gast
Die Daten, die in die DB geschrieben werden, bestehen immer aus 8 Einträgen der Form

Eintrag1|Eintrag2|Eintrag3|Eintrag4|Eintrag5|Eintrag6|Eintrag7|n

Wobei Eintrag7 eventuell als '' gespeichert wird, aber trotz dem existiert.

Bisher sind nur zwei Datensätze in der DB vorhanden. Wenn ich aus der Konsole über beide ... laufen lasse, bekomme ich immer 8.

Code: Alles auswählen

liste = db[key].split('|')
len(liste)
Also behaupte ich jetzt mal ganz frech (kann mich auch irren), dass es nicht an der DB liegt. Oder?

Verfasst: Donnerstag 13. Januar 2005, 21:44
von Dookie
Hi,

Code: Alles auswählen

for key in db.keys(): # über die Zeilen iterieren
    line = db[key].split('|')
    for row in line: # über die Einträge iterieren
        if row[7] == 'n': # ? 
überleg mal was row dann ist. Ich denke das if row[7] == 'n' ist wohl in der falschen Zeile. Und es müsste heißen if line[7] == 'n':


Gruß

Dookie

Verfasst: Freitag 14. Januar 2005, 20:20
von bmh1980
Genau das wollte ich gerade schreiben.

Ich Rindviech habe doch tatsächlich die einzelnen String aus der Liste als Liste behandeln wollen. :roll:

Was sagt uns das? Schreibe keine Skripte, wenn du am flirten bist. :wink:

Und jetzt zieh ich mich mit hochrotem Kopf, ganz leise in eine Ecke zurück. :oops: *schäm*

Marcus