Formulardaten verarbeiten...

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

Formulardaten verarbeiten...

Beitragvon nemomuk » Samstag 10. November 2007, 22:44

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=]<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" />[/code]

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!
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Re: Formulardaten verarbeiten...

Beitragvon Leonidas » Sonntag 11. November 2007, 11:50

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 Modvoice
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Beitragvon nemomuk » Sonntag 11. November 2007, 13:51

aha...^^

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

Keine Ahnung was an dem Script falsch ist?!

Danke!
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 11. November 2007, 14:01

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 Modvoice
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Beitragvon nemomuk » Sonntag 11. November 2007, 14:45

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Sonntag 11. November 2007, 14:57

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

Beitragvon nemomuk » Sonntag 11. November 2007, 15:01

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

Beitragvon birkenfeld » Sonntag 11. November 2007, 16:54

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

Beitragvon lunar » Sonntag 11. November 2007, 17:02

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

Beitragvon nemomuk » Sonntag 11. November 2007, 17:24

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^^

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder