Seite 1 von 1

Formulardaten verarbeiten...

Verfasst: Samstag 10. November 2007, 22:44
von nemomuk
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!

Re: Formulardaten verarbeiten...

Verfasst: Sonntag 11. November 2007, 11:50
von Leonidas
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.

Verfasst: Sonntag 11. November 2007, 13:51
von nemomuk
aha...^^

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

Keine Ahnung was an dem Script falsch ist?!

Danke!

Verfasst: Sonntag 11. November 2007, 14:01
von Leonidas
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.

Verfasst: Sonntag 11. November 2007, 14:45
von nemomuk
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!!!

Verfasst: Sonntag 11. November 2007, 14:57
von gerold
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
:-)

Verfasst: Sonntag 11. November 2007, 15:01
von nemomuk
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!

Verfasst: Sonntag 11. November 2007, 16:54
von birkenfeld
SchneiderWeisse hat geschrieben:Also, auf bayrisch gsagt, habens mir "ins Hirn gschissn"
Och, keine Sorge, das passiert sogar Ministerpräsidenten relativ oft...

Verfasst: Sonntag 11. November 2007, 17:02
von 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...

Verfasst: Sonntag 11. November 2007, 17:24
von nemomuk
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^^