Schrift
[thread]650[/thread]

Insert bei vielen Feldern.... (Seite 2)



<< |< 1 2 >| >> 16 Einträge, 2 Seiten
Strat
 2006-01-18 19:29
#6666 #6666
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
am anfang baue ich eine mapping tabelle. dafuer verwende ich einen hash, dessen keys die feldnamen der html-form sind und dessen values die dazugehoerigen felder in der datenbank sind, also was in folgendem feld eingegeben wurde
Code: (dl )
<input type="text" name="counter" />

soll in die db-spalte count.

nun wird ein neues cgi-objekt erzeugt, und die parameter der html-form in einen Hash namens %params eingelesen:
Code: (dl )
1
2
my $cgi = CGI->new();
my %params = $cgi->Vars();

ich habe also in $params{counter} den wert fuer die DB-Spalte count; auf den namen "count" komme ich z.B. ueber $mappings_form2db{counter} dran.

Bei keys %hash (bzw. values) %hash wird eine liste der schluessel (bzw. werte) in irgendeiner reihenfolge zurueckgegeben. Perl selbst garantiert lediglich, dass (sofern man den hash nicht veraendert) keys und values dieselbe (zufaellige) reihenfolge zurueckgeben, also kann ich mir mit values(%mappings_form2db) die ganzen db-spaltennamen in irgendeiner beliebigen reihenfolge zureckgeben lassen, und ebenso ueber keys(%mappings_form2db) die namen der werte (sind die keys von %params), und zwar in derselben reihenfolge.
Code: (dl )
1
2
3
4
5
map {
$dbh->quote( # ein wenig sicherheit, escape SQL-Sonderzeichen
$params{$_} # $_ ist key, also wert des entsprechenden feldes
)
} keys %mappings_form2db # gibt also die liste der keys fuer %params zurueck



wird's jetzt ein wenig klarer? wenn nicht, frag einfach
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
zipster
 2006-01-19 11:27
#6667 #6667
User since
2004-09-06
458 Artikel
BenutzerIn
[default_avatar]
Super, jetzt ist es mir doch um einiges klarer.

Korrigiere mich bitte wenn ich falsch liege.

Da ja mein html-formnamen gleich den db-Feldernamen sind kann ich mir doch eigentlich das mapping sparen oder?

Wäre es korrekt wenn ich den Code wie folgt benutzte?
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
my %element;
$element{liste} =
[
{ art => "textfield", name => "nachname",
bez => "Nachname:", size => 20},
{ art => "textfield", name => "vorname",
bez => "Vorname:", size => 20},
{ art => "popup_menu", name => "zimmerbett",
bez => "Zimmer/Bett:",},
{ art => "popup_menu", name => "anrede",
bez => "Anrede:",},
....
];
...
My $cgi = CGI->new();
My %params = $cgi->Vars();

My $sql = qq~INSERT INTO Kontakt (~
. join (',', values %element{name})
.qq~) VALUES (~
. join(',',map { $dbh->quote($params{$_} ) } keys %element{name}
.")";


Trotz deiner sehr guten Erklärung habe ich trotzdem noch Fragen.

Was bewirkt das qq in dem SQL INSERT Befehl?
"~" Wird doch normalerweise als Trennungszeichen benutzt, warum taucht das auch in diesem Befehl auf?
Du hast doch folgendes oben in deinem Codeschnipsel stehe:
Code: (dl )
1
2
3
# hier dann die gueltigkeit ueberpruefen
# ...
# und dann das sql bauen:


Was für ne Gültigkeit soll ich überprüfen? Wenn ich ein Date Feld benutzte das dann auch ein Datum drin steht oder wie ist das gemeint?


Und schon mal vielen Dank hast mir echt weitergeholfen.\n\n

<!--EDIT|zipster|1137662990-->
Strat
 2006-01-19 17:19
#6668 #6668
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
also wenn das mapping 1:1 ist, koenntest du auf die mapping-tabelle verzichten und z.B. mit einer Liste arbeiten:
Code: (dl )
1
2
3
4
5
6
7
8
9
my @fields = qw(nachname vorname adresse ort);
my $cgi = CGI->new();
my %params = $cgi->Vars();

my $sql = 'INSERT INTO tabelle ('
. join(', ', @fields)
. ') VALUES ('
. join(", ", map { $dbh->quote( $params{$_} ) } @fields )
. ')';

nur wuerde ich auf die Liste der DB-Felder nicht verzichten, weil es fuer einen Benutzer ja ein leichtes ist, weitere HTML-Felder hinzuzufuegen


qq~...~ oder qq/.../ oder qq{...} usw. enspricht "..."
q~...~ oder q/.../ oder q{...} usw. entspricht '...'
nur darf das trennzeichen dann in der zeichenkette nicht vorkommen.

wenn ich Zeichenketten habe, in denen z.B. " oder ' vorkommen, verwende ich lieber keine Anfuehrungszeichen, sondern qq oder q, damit ich die " bzw. ' im String nicht zu escapen brauche. In dem Fall von oben waere es egal, weil ja im String selbst keine Anfuehrungszeichen vorkommen.

Damian Conway empfiehlt im Buch "Practial Perl" uebrigens q{...} oder qq{...}

zur Gueltigkeit: wenn informationen von extern kommen (z.B. von einem Benutzer), kann der da auch (absichtlich oder unabsichtlich) beliebigen Schrott eingeben, oder Pflichtfelder nicht befuellen.
Wenn z.B. eine Datumseingabe nicht im korrekten Format ist, fliegt einem wahrscheinlich das SQL um die Ohren. Meist ist es jedoch besser, die Daten vorweg zu ueberpruefen und bei Fehlern dem Benutzer die Moeglichkeit zu bieten, die falschen Eingaben zu korrigieren.
Oder wenn der Benutzer eine Email-Adresse eingeben soll und einfach reinschreibt: "keine", dann koennte es spaeter mal unnoetig probleme bereiten, wenn man versucht, an diese Mailadresse eine Mail zu senden.
oder wenn eine zahl erwartet wird und jemand schreibt rein "nix" ...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
zipster
 2006-01-19 17:36
#6669 #6669
User since
2004-09-06
458 Artikel
BenutzerIn
[default_avatar]
Quote
lso wenn das mapping 1:1 ist, koenntest du auf die mapping-tabelle verzichten und z.B. mit einer Liste arbeiten:

Gut Okay. Also würde das mit meinem Beispiel auch funktionieren

Quote
nur wuerde ich auf die Liste der DB-Felder nicht verzichten, weil es fuer einen Benutzer ja ein leichtes ist, weitere HTML-Felder hinzuzufuegen

Wie will den ein User Felder hinzufügen? Das CGI-Script liegt doch auf dem Server.

Quote
qq~...~ oder qq/.../ oder qq{...} usw. enspricht "..."
q~...~ oder q/.../ oder q{...} usw. entspricht '...'
nur darf das trennzeichen dann in der zeichenkette nicht vorkommen.

wenn ich Zeichenketten habe, in denen z.B. " oder ' vorkommen, verwende ich lieber keine Anfuehrungszeichen, sondern qq oder q, damit ich die " bzw. ' im String nicht zu escapen brauche. In dem Fall von oben waere es egal, weil ja im String selbst keine Anfuehrungszeichen vorkommen.

Damian Conway empfiehlt im Buch "Practial Perl" uebrigens q{...} oder qq{...}

Wieder was gelernt.
Jedes mal wenn ihr mit so "Monsterschnipsel" ankommt denke ich immer ich wäre voll der noob. ;)

Quote
zur Gueltigkeit: wenn informationen von extern kommen (z.B. von einem Benutzer), kann der da auch (absichtlich oder unabsichtlich) beliebigen Schrott eingeben, oder Pflichtfelder nicht befuellen.
Wenn z.B. eine Datumseingabe nicht im korrekten Format ist, fliegt einem wahrscheinlich das SQL um die Ohren. Meist ist es jedoch besser, die Daten vorweg zu ueberpruefen und bei Fehlern dem Benutzer die Moeglichkeit zu bieten, die falschen Eingaben zu korrigieren.
Oder wenn der Benutzer eine Email-Adresse eingeben soll und einfach reinschreibt: "keine", dann koennte es spaeter mal unnoetig probleme bereiten, wenn man versucht, an diese Mailadresse eine Mail zu senden.
oder wenn eine zahl erwartet wird und jemand schreibt rein "nix" ...

Gut. Das werde ich einbauen wenn das schreiben in die Datenbank endlich so funktioniert wie ich das möchte.
Strat
 2006-01-19 19:04
#6670 #6670
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=zipster,19.01.2006, 16:36]
Quote
nur wuerde ich auf die Liste der DB-Felder nicht verzichten, weil es fuer einen Benutzer ja ein leichtes ist, weitere HTML-Felder hinzuzufuegen

Wie will den ein User Felder hinzufügen? Das CGI-Script liegt doch auf dem Server.[/quote]
das script liegt auf dem server, aber die werte, die in irgendwelche html-felder eingetragen werden, kommen i.d.R. von einem webbrowser, also von einem user, und diese felder und feldwerte werden dem script als parameter uebergeben. also kann ein user entweder im aufruf des scriptes weitere parameter spezifizieren, oder sich z.B. die html-seite downloaden, da ein weiteres feld hinzufuegt und dann einen weiteren wert wegschickt.

wie kommen eigentlich die daten aus der html-form ans cgi-script? dafuer gibt es zwei wege (wird in <form method="..."> angegeben

GET: da werden sie einfach an die URL drangehaengt, z.B.
script.cgi?param1=value1;param2=value2 (so wie auch meistens hier im forum); dann kann man einfach die URL anpassen, indem man z.B. schreibt
script.cgi?param1=value1;param2=value2;neuerparam=neuervalue

POST: hier werden die daten nicht ueber die URL, sondern ueber den HTTP-Header vom webbrowser uebermittelt; es ist zwar ein klein wenig schwieriger, da weitere parameter hinzuzufuegen, aber auch machbar.\n\n

<!--EDIT|Strat|1137690413-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
zipster
 2006-01-19 20:03
#6671 #6671
User since
2004-09-06
458 Artikel
BenutzerIn
[default_avatar]
AHA! :rock:

Ich kann dir nicht sagen ob ich es per "POST" oder per "GET" mache.

Grundlage für mein Script war nämlich eins das ich mit hilfe eines Buches aufgebaut habe. Und <form method="..."> gibt es bei mir nicht da ich alles aus einem CGI-Script heraus mache. Eine Html-Seite an sich gibt es nicht, die wird vom CGI-Script erzeugt.

Fand diese Lösung am besten weil ich so die Seite möglichst dynamisch gestalten konnte.

Aktionen wie z.B. das drücken der "Senden" Taste fange ich aber wie folgt ab
Code: (dl )
my $aktion = lc (param ("aktion"));

Also denke ich mal das ich die "POST" Variante verwende.


Ich befasse mich auch noch nicht so lange mit CGI, sehr oft verstehe ich im Moment nämlich nur Bahnhof und finde durch probieren heraus wie was funktioniert....
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2006-01-17 16:28.