Formulardaten verarbeiten...

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Hallo,

ich habe versucht per Python Script Formulardaten auszulesen und dann in eine Datenbank zu schreiben...

Code: Alles auswählen

import cgitb; cgitb.enable()
import cgi
form = cgi.FieldStorage()
print "Content-Type: text/html\n"

import MySQLdb
connection = MySQLdb.connect(
	host="localhost",
	db="johannes",
	user="johannes",
	passwd="23434536")   

#Datenbankabfrage
datum_tag = ""
datum_monat = ""
datum_jahr = ""
kommentar = ""
kategorie = ""
preis_ganz = ""
preis_komma = ""
a = range(0,9)
for one in a:
	if form.has_key("datum_tag_" + str(a)):
		global datum_tag
		datum_tag = form["datum_tag_" + str(a)].value
	if form.has_key("datum_monat_" + str(a)):
		global datum_monat
		datum_monat = form["datum_monat_" + str(a)].value
	if form.has_key("datum_jahr_" + str(a)):
		global datum_jahr
		datum_jahr = form["datum_jahr_" + str(a)].value
	datum = str(datum_tag) + "." + str(datum_monat) + "." + str(datum_jahr)
	if form.has_key("kommentar_" + str(a)):
		global kommentar
		kommentar = form["kommentar_" + str(a)].value
	if form.has_key("kategorie_" + str(a)):
		global kategorie
		kommentar = form["kategorie_" + str(a)].value
	if form.has_key("preis_ganz_" + str(a)):
		global preis_ganz
		kommentar = form["preis_ganz_" + str(a)].value
	if form.has_key("preis_komma_" + str(a)):
		global preis_komma
		kommentar = form["preis_komma_" + str(a)].value
	preis = str(preis_ganz) + str(preis_komma)
	anfrage1 = connection.cursor()
	anfrage1.execute("INSERT INTO qwe(datum,preis,kommentar,kategorie) VALUES(" + datum + "," + preis + "," + kommentar + "," + kategorie + ")")
Hier ist der HTML Code:

Code: Alles auswählen

<input size="2" type="text" name="datum_tag_0" /><input size="2"type="text" name="datum_monat_0" value="11" /><input size="4"type="text" name="datum_jahr_0" value="2007" />
						<select style="float:left;" name="kategorie_0">
							<option>Lebensmittel</option>

							<option>Schreibwaren</option>
							<option>Treibstoff</option>
							<option>Sonstige</option>
						</select>
<textarea style="width:90%;height:50px;" name="kommentar_0"></textarea>>
<input size="6" type="text" name="preis_ganz_0" />
<input size="2"type="text" name="preis_komma_0" />
Das ganze habe ich per for gelöst da ich maximal 10 solche teile mit jeweils den ´verschiedenen names von 0-9 habe...

Wo ist mein Fehler - er spuckt irgendwie aus, dass ich einen Fehler in meinem SQL Querie habe - nur wo?

Oder geht das ganz überhaupt so?!

Vielen Dank!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

SchneiderWeisse hat geschrieben:Oder geht das ganz überhaupt so?!
Ja, wenn man das Fehlerfrei macht, dann geht das schon so. Aber wozu das so machen, wenn man Form-Validation mit FormEncode machen kann, Formulare mit FormBuild generieren kann und die SQL-Queries über ein ORM erledigen kann.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

aha...^^

aber soweit bin ich leider noch nicht - bin erst 2 Tagen an Python dran...

Keine Ahnung was an dem Script falsch ist?!

Danke!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das Problem ist schon allein dass, dass du die Datenbankschnittstelle die Werte hättest einfüllen lassen sollen, sonst hast du prima SQL-Injections in deinem Programm.

Vorschlag: Du lässt das mit dem SQL sein und nimmst erstmal ein ORM. Ob das nun SQLAlchemy, SQLObject, Django oder Storm ist nicht so besonders wichtig, solange du nicht sehr komplizierte Anforderungen hast.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

also mittlerweile, bin ich schon so weit, dass er keinen Fehler ausspuckt und mir bei diesem Script, das oben steht, auch so viel Zeilen macht, wie gewünscht... Nur leider sind die Zeilen in der Datenbank leer^^

Was dafür spricht, dass er meine form("qwe") nicht findet...

kann es sein, dass das so nicht geht mit der for Schleife?

EDIT: Außerdem hab ich festgestellt, dass es ohn die ganze for-Schleife auch geht...

Kann es daran liegen, dass:

Code: Alles auswählen

if form.has_key("datum_monat_" + str(a)):
		global datum_monat
		datum_monat = form["datum_monat_" + str(a)].value
nicht funktioniert? Oder in diesem Fall, irgendwie falsch gemacht wurde?

Danke!!!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo SchneiderWeisse!

Ich rate dir unbedingt noch einmal ein paar Seiten über Datenbankprogrammierung rein zu ziehen.

- http://www.python-forum.de/topic-11615.html
- [wiki]DB-API[/wiki]
- [wiki]Parametrisierte SQL-Queries[/wiki]
- http://www.python-forum.de/topic-6157.html

So in etwa sollte es funktionieren. Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

print "Content-Type: text/html\n"

import cgi
import cgitb; cgitb.enable()
import MySQLdb
import datetime


form = cgi.FieldStorage()
conn = MySQLdb.connect(
    host="localhost", db="johannes", user="johannes", passwd="23434536"
)

for index in xrange(10):
    datum_tag = form.getvalue("datum_tag_%i" % index, None)
    datum_monat = form.getvalue("datum_monat_%i" % index, None)
    datum_jahr = form.getvalue("datum_jahr_%i" % index, None)
    datum = datetime.datetime(int(datum_jahr), int(datum_monat), int(datum_tag))
    kommentar = form.getvalue("kommentar_%i" % index, None)
    kategorie = form.getvalue("kategorie_%i" % index, None)
    preis_ganz = int(form.getvalue("preis_ganz_%i" % index, 0))
    preis_komma = int(form.getvalue("preis_komma_%i" % index, 0))
    preis = float("%i.%i") % (preis_ganz, preis_komma)

    cur = conn.cursor()
    # Vielleicht musst du die "%s" in der SQL-Anweisung durch "?" ersetzen 
    # (weiß ich jetzt nicht auswendig)
    sql = """
    INSERT INTO qwe (
      datum, preis, kommentar, kategorie
    ) VALUES (
      %s, %s, %s, %s
    )
    """
    cur.execute(sql, (datum, preis, kommentar, kategorie))

conn.commit()

print "Fertig"
mfg
Gerold
:-)
Zuletzt geändert von gerold am Sonntag 11. November 2007, 15:02, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Also, auf bayrisch gsagt, habens mir "ins Hirn gschissn"

ich habe oben bei der for-Schleife:

a = range(0,10)
for one in a:
... und hier leider immer a verwendet statt one...

Also hätte eigentlich auch so, wie ich es anfangs hatte geklappt...

Trotzdem Danke!
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

SchneiderWeisse hat geschrieben:Also, auf bayrisch gsagt, habens mir "ins Hirn gschissn"
Och, keine Sorge, das passiert sogar Ministerpräsidenten relativ oft...
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
lunar

birkenfeld hat geschrieben:
SchneiderWeisse hat geschrieben:Also, auf bayrisch gsagt, habens mir "ins Hirn gschissn"
Och, keine Sorge, das passiert sogar Ministerpräsidenten relativ oft...
Da ist dieser Zustand sogar eher Regel denn Ausnahme...
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

genau meine Meinung....
Sowohl ehemalige, als auch derzeitige Ministerpräsidenten scheinen diesem Gesetz zu folgen... Somit könnte man das in Bayern schon als Konstante festlegen^^
Antworten