selfhtml.de - Alles für den Webmaster!

 

Empfehlung:

wix.com

Kostenlose Homepage

Besuchen Sie auch:

Jobs:

Subroutine über Formularbutton aufrufen

Autor: rooot
Datum: 22.09.2009 14:07:11

Hallo,

ich möchte eine Subroutine über einen Button in einem eingebetteten HTML Formular ausführen.
Habe dies mit folgendem Code probiert aber ohne Erfolg.

while (my @row = $prep_sql->fetchrow_array())
{
    print qq{<form action="StundenzettelKom.pl?action=test"  method="post">};
    print qq{<td><input type=button value="test" onClick="submit()"/>n</td>};
    print qq{<td><input type="text" name="ID_Tabelle_Zeiten" value="$row[0]" />n</td>};
    print qq{<td><input type="text" name="Vorname" value="$row[1]" />n</td>};
......}

$query = new CGI;
$command = $query -> param('action');
if ($command eq "test") {&test}

sub test {
  
my $db_name = 'Stundenzettel';
my $db_user  = '*****';
my $db_pass = '*****';
my $db_host = 'localhost';
my $dbh = DBI->connect('DBI:mysql:'.$db_name.':'.$db_host,$db_user,$db_pass) or die $DBI::errstr;

read(STDIN, $Formulardaten, $ENV{'CONTENT_LENGTH'});
@Formularfelder = split(/&/, $Formulardaten);
foreach $Feld (@Formularfelder)
{
  ($Name, $Value) = split(/=/, $Feld);
   $Value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
   $Value =~ s/~!/ ~!/g;
   $Value =~ s/|/|/g;
  
  if($Name eq "ID_Tabelle_Zeiten") { $ID_Tabelle_Zeiten = $Value; }
  if($Name eq "Vorname") { $Vorname = $Value; }
  if($Name eq "Nachname") { $Nachname = $Value; }
  if($Name eq "Datum") { $Datum = $Value; }
  if($Name eq "Ort") { $Ort = $Value; }
  if($Name eq "Anfang") { $Anfang = $Value; }
  if($Name eq "Ende") { $Ende = $Value; }
  if($Name eq "Stunden") { $Stunden = $Value; }
  if($Name eq "Pausen") { $Pausen = $Value; }
  if($Name eq "Unterschrift") { $Unterschrift = $Value; }
  if($Name eq "Ueberstunden") { $Ueberstunden = $Value; }
  if($Name eq "Gesamtstunden") { $Gesamtstunden = $Value; }
}


my $insert = 'INSERT INTO Tabelle_Zeiten (ID_Tabelle_Zeiten,Vorname,Nachname,Datum,Ort,Anfang,Ende,Stunden,Pausen,Unterschrift,Ueberstunden,Gesamtstunden) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)';
my $sth = $dbh->prepare($insert) or die $dbh->errstr();
$sth->execute("$ID_Tabelle_Zeiten","$Vorname","$Nachname","$Datum","$Ort","$Anfang","$Ende","$Stunden","$Pausen","$Unterschrift","$Ueberstunden","$Gesamtstunden") or die $dbh->errstr();

$dbh->disconnect();
}

In der Subroutine sollen die eingegebenen Formulardaten in eine Datenbank geschrieben werden.Das Problem dabei ist, ich muß ein Unterprogramm erstellen damit der Code des Abschnitts für den Datenbankzugriff nur beim Eintragen eines Datensatzes ausgeführt wird.Wenn die Seite über den Browser ausgeführt wird, trägt sich sonst immer ein neuer Datensatz ein.Nun möchte ich das Problem über einen Button der auf die Subroutine zugreift realisieren.Außerdem soll das Programm nur in einer Datei stehen.Ist das möglich?

Danke schon im voraus?
rooot

  



Re: Subroutine über Formularbutton aufrufen

Autor: rooot
Datum: 22.09.2009 14:16:57

Hab mich am Ende verschrieben.Sollte ! statt ? heißen. Freu mich auf jede Antwort.Danke schonmal vorab.
rooot



Re: Subroutine über Formularbutton aufrufen

Autor: moll
Datum: 23.09.2009 14:02:03

Hallo!

while (my @row = $prep_sql->fetchrow_array())
{
    print qq{<form action="StundenzettelKom.pl?action=test"  method="post">};
    print qq{<td><input type=button value="test" onClick="submit()"/>n</td>};
    print qq{<td><input type="text" name="ID_Tabelle_Zeiten" value="$row[0]" />n</td>};
    print qq{<td><input type="text" name="Vorname" value="$row[1]" />n</td>};
......}
# ich nehme mal an dass hier nur ein Datensatz gelesen wird?
# sonst geht das so nicht, weil sonst müsste man die Namen der Eingabefelder mit einer Id versehen
# so, Vornam01, Vorname02 ..
# und wenn dem nicht so ist so ist, kannst du hier die Schleife weglassen
# das sieht dann so aus:
sub get {
my $id = shift;
# connect
my $query = qq{SELECT * FROM stunden WHERE id =$id};
# prepare, execute
my $ref = $prep_sql->fetchrow_hashref()){
# finish
return $ref;
}

# und für die Ausgabe
sub show {
    my $ref = shift; # das ist die Rückgabe vom get()
    print qq{<form action="StundenzettelKom.pl?action=test"  method="post">};
    print qq{<input type=submit value='Anzeigen'"/>};
    print qq{<input type=submit name="save" value='Speichern'"/>};
    print qq{<input type="hidden" name="id" value="$ref->{id}" />};
    print qq{<td><input type="text" name="ID_Tabelle_Zeiten" value="$ref->{ID_Tabelle_Zeiten}" />n</td>};
    print qq{<td><input type="text" name="Vorname" value="$$ref->{Vorname}" />n</td>};
    ...
}

$query = new CGI;
$command = $query -> param('action');
if ($command eq "test") {&test}

sub test {
  
my $db_name = 'Stundenzettel';
my $db_user  = '*****';
my $db_pass = '*****';
my $db_host = 'localhost';
my $dbh = DBI->connect('DBI:mysql:'.$db_name.':'.$db_host,$db_user,$db_pass) or die $DBI::errstr;
# wenn du oben schon ein cgi-Objekt definierst, dann kann das weg:
# vor hier ..
read(STDIN, $Formulardaten, $ENV{'CONTENT_LENGTH'});
[..]
  if($Name eq "Gesamtstunden") { $Gesamtstunden = $Value; }
}
# .. bis hier
# und statt dessen geht sowas:
my @data;
push @data, $cgi->param('vormame') || "";
push @data, $cgi->param('nachname') || "";
# und dann
my $insert = 'INSERT INTO Tabelle_Zeiten (ID_Tabelle_Zeiten,Vorname,Nachname,Datum,Ort,Anfang,Ende,Stunden,Pausen,Unterschrift,Ueberstunden,Gesamtstunden) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)';
my $sth = $dbh->prepare($insert) or die $dbh->errstr();
$sth->execute(@data) or die $dbh->errstr();
$dbh->disconnect();
}

# Und nun zur Steuerung

#!/usr/bin/perl -w
use CGI qw(:standard);
BEGIN {
use CGI::Carp qw(carpout fatalsToBrowser);
open LOG,">>prog.log";
carpout(*LOG);
}
print "Content-type: text/htmlnn";
my $cgi = new CGI;
$_ = $cgi->param('action') || "";

if (/save/ && $cgi->param('id')){
&save(); # nenne die Fkt test hier mal save
} elsif (/show/ && $cgi->param('id'){  (
my $data = &get($cgi->param('action'));
&show($data);
} else  {
&list(); # diese müsstest du noch schreiben
}

1;

Das Formular hat dann zwei Submitbutton Anzeigen und Save. Sie save-Fkt. kannst du dann in Abhängigt des Vorhandenseins einer ID entweder als INSERT oder als UPDATE ausführen.

Gruß Matthias