Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]650[/thread]

Insert bei vielen Feldern....



<< |< 1 2 >| >> 16 Einträge, 2 Seiten
zipster
 2006-01-17 16:28
#6656 #6656
User since
2004-09-06
458 Artikel
BenutzerIn
[default_avatar]
Hi,

wenn man sehr viele Felder in seinem CGI Script hat und möchte den Inhalt in eine Datenbank schreiben gibt es ein besser möglichkeit als jedes Feld extra zu schreiben?
Im Moment ist mir nur diese Möglichkeit bekannt.
Code: (dl )
1
2
INSERT INTO Beispiel (beispiel1,beispiel2,beispiel3) VALUES(?,?,?),
undef,test1,test2;


Ich habe meine Felder vorher so definiert
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
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:",},
....
]



Bin für jede Hilfe Dankbar

Gruß
Seri aka Zipster
Taulmarill
 2006-01-17 16:47
#6657 #6657
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
was meinst du mit "jedes feld einzeln schreiben"? mit herkömmlichem SQL würde ich eine transaktion anfangen und mit prepare ein SQL-Statement mit entsprechenden platzhaltern vorbereiten, so wie du das oben getan hast. dann halt in einer schleife für alle datensätze das statement einmal mit den daten ausführen und die transaktion beenden. die transaktion kannst du natürlich auch weglassen, aber dadurch wird die ausführung bei den meisten dbs schneller.

auf was willst du denn optimieren? performance, lesbarkeit, stil, ....? "besser" ist ein sehr dehnbarer begriff.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
zipster
 2006-01-17 17:48
#6658 #6658
User since
2004-09-06
458 Artikel
BenutzerIn
[default_avatar]
[quote=Taulmarill,17.01.2006, 15:47]was meinst du mit "jedes feld einzeln schreiben"? mit herkömmlichem SQL würde ich eine transaktion anfangen und mit prepare ein SQL-Statement mit entsprechenden platzhaltern vorbereiten, so wie du das oben getan hast. dann halt in einer schleife für alle datensätze das statement einmal mit den daten ausführen und die transaktion beenden. die transaktion kannst du natürlich auch weglassen, aber dadurch wird die ausführung bei den meisten dbs schneller.

auf was willst du denn optimieren? performance, lesbarkeit, stil, ....? "besser" ist ein sehr dehnbarer begriff.[/quote]
Wenn ich ein INSERT Befehl für %element schreiben wollte würde das ja so aussehen.
Code: (dl )
1
2
INSERT INTO kontakte (nachname,vorname,zimmerbett,anrede,...) VALUES(?,?,?,?,...),
"param ('nachname')","param ('vorname')","param ('zimmerbett')","param ('anrede')";


Und ich müßte jedes Feld extra im Befehl schreiben.
Ich suche halt ne möglichkeit das das alles möglich dynamisch ist.
Das heißt wenn ich in %element ein neues Element anlege das dieser Inhalt dann auch in die Datenbank geschrieben wird ohne den INSERT Befehl ändern zu müssen.

Vestehst du was ich meine?
Strat
 2006-01-17 17:58
#6659 #6659
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
sql generieren, z.B. ueber ein Mapping?
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
my %mappings_form2db = (
# form => db
counter => 'count' ,
name => 'name' ,
tel => 'telephoneNumber',
);
my $cgi = CGI->new();
my %params = $cgi->Vars();
# hier dann die gueltigkeit ueberpruefen
# ...
# und dann das sql bauen:
my $sql = qq~INSERT INTO table (~
. join (', ', values %mappings_form2db)
. qq~) VALUES (~
. join(', ', map { $dbh->quote($params{$_} ) } keys %mappings_form2db
. ")";

oder so aehnlich...\n\n

<!--EDIT|Strat|1137605398-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
renee
 2006-01-18 00:52
#6660 #6660
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich benutze ungern direkt das quote, sondern lieber die ?-Notation. Erstens spart es mir den direkten Aufruf und zweitens sehe ich dann beim execute direkt, was alles eingefuegt wird...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pq
 2006-01-18 09:14
#6661 #6661
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
ich finde, die methode mit quote() hat nur den einen vorteil: man kann
das statement leicht zum debuggen ausgeben. bei platzhaltern ist es
etwas schwieriger.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
ptk
 2006-01-18 10:04
#6662 #6662
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=pq,18.01.2006, 08:14]ich finde, die methode mit quote() hat nur den einen vorteil: man kann
das statement leicht zum debuggen ausgeben. bei platzhaltern ist es
etwas schwieriger.[/quote]
DBI_TRACE=2 kann hier helfen.
Taulmarill
 2006-01-18 11:30
#6663 #6663
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
wenn du die formularfelder entsprechend der feldnamen deiner datenbank benennst, dann kannst du abstraktionsmodulen wie DBIx::Class oder Class::DBI einfach den hash üebrgeben.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Strat
 2006-01-18 17:19
#6664 #6664
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
@Taulmarill: dann kann es passieren, dass da ein user weitere felder angibt (z.B. via GET), die eventuell automatisch erstellt werden sollen (autoincrement, timestamp, ...); sowas koennte eventuell probleme bereiten.
von daher userinput nie vertrauen
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
zipster
 2006-01-18 19:01
#6665 #6665
User since
2004-09-06
458 Artikel
BenutzerIn
[default_avatar]
Erstmal Danke an alle...

@Strat
Ich verstehe den Codeschnippsel von dir zwar noch nicht so ganz aber ich versuche mich mal einzuarbeiten...:rock:
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



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