Lösung zu Blatt 6 --- Software Engineering Praxis (SS 2002)
Nur ein paar Adressen
#!/usr/local/bin/perl -Tw
use CGI;
use DBI;
use Mysql::Admin qw(dbi_connect);
use strict;
my ($dbdir, $host, $prj, $login, $auth) =
('/home/thales/melzer/mysql/data', 'localhost', 'project',
'', '');
my $db = DBI->connect(dbi_connect($dbdir, $host, $prj), "$login", "$auth");
die unless defined $db; # Man koennte auch eine nette Meldung ausgeben.
my %abt = (); # Lese alle Abteilungen ein
my $query = $db->prepare('select abtid, name from Abteilungen;');
$query->execute;
foreach (@{$query->fetchall_arrayref([0, 1])}) {
$abt{$_->[0]} = $_->[1];
}
$query->finish;
my $q = new CGI; # Der uebliche Prolog
print $q->header, $q->start_html("Eine kleine Personendatenbank"),
$q->h1("Eine kleine Personendatenbank");
if (defined $q->param('pwd') && $q->param('pwd') ne "Passwort") {
print $q->p('Das Passwort war leider falsch!'), "\n";
print $q->hr(), "Ingo Melzer", $q->end_html;
$db->disconnect;
exit;
}
my %kinds = qw(search Suche insert Eingabe change Änderungen);
my $kind = $q->param('kind') || "first";
if ($kind eq "insert") { # Datensatz einfuegen
my ($name, $tel, $abt) =
($q->param('name'), $q->param('tel'), $q->param('abt'));
if (defined $abt) { # Wurden schon Daten eingetragen? Ja -> Insert
my $query =
$db->prepare('insert into Angestellte values (NULL, ?, ?, ?);');
$query->execute($name, $tel, $abt);
$query->finish;
print $q->p("$name wurde eingefügt!"), $q->hr, "\n";
}
print $q->h3('Person einfügen:'), "\n"; # Sonst Daten erfragen
print $q->start_form();
print $q->p('Name: ',
$q->textfield(-name => "name", -size => 30, -maxlength => 255,
-default => '', -override => 1));
print $q->p('Telefon: ',
$q->textfield(-name => "tel", -size => 30, -maxlength => 255,
-default => '', -override => 1));
print $q->p($q->scrolling_list(-name => "abt", -values => [keys %abt],
-labels => \%abt, -default => 'SAI'));
} elsif ($kind eq "search") { # Suche eine Person
my ($name) = $q->param('name');
if (defined $name and $name =~ /^(\w|\s)+$/) {
my $query =
$db->prepare('select name, telefon, abtid from Angestellte where '.
'name like ?;');
$query->execute($name . '%');
my @results = ();
while (defined(my $record = $query->fetch())) {
push @results, [@{$record}[0, 1], $abt{$record->[2]}];
}
$query->finish; # Den map muss man nicht verstehen.
print $q->table({-border => 1 }, $q->caption('Ergebnis der Suche:'),
$q->Tr({-align => 'CENTER', -valign => 'TOP'}, [
$q->th(['Name', 'Telefon','AbtID']),
map {$q->td($_)} @results
]));
}
print $q->start_form();
print $q->p('Anfang des gesuchten Namen: ',
$q->textfield(-name => "name", -size => 30, -maxlength => 255,
-default => '', -override => 1));
} elsif ($kind eq "change") { # Aendern
my ($name) = $q->param('name');
print $q->start_form();
if (defined $name and $name =~ /^(\w|\s)+$/) {
my ($persid, $tel, $abt) =
($q->param('persid'), $q->param('tel'), $q->param('abt'));
unless (defined $persid and $persid =~ /^\d+$/) { #Person noch unbekannt?
my $query =
$db->prepare('select persid, telefon, abtid from Angestellte '.
'where name = ?;');
$query->execute($name);
unless ($query->rows) {
print $q->p("Die Person gibt es leider nicht!"), "\n";
} else { # OK, Daten erfragen und mit defaults fuellen
($persid, $tel, $abt) = $query->fetchrow_array;
print $q->hidden(-name => 'persid', -value => $persid);
print $q->p('Name: ',
$q->textfield(-name => "name", -size => 30, -maxlength => 255,
-default => $name));
print $q->p('Telefon: ',
$q->textfield(-name => "tel", -size => 30, -maxlength => 255,
-default => $tel));
print $q->p($q->scrolling_list(-name => "abt",
-values => [keys %abt], -labels => \%abt, -default => $abt));
}
} else { # Alles bekannt, jetzt nur noch in die Datenbank
my $query =
$db->prepare('replace into Angestellte values (?, ?, ?, ?);');
$query->execute($persid, $name, $tel, $abt);
$query->finish;
print $q->p("$name wurde geändert!"), $q->hr, "\n";
}
} else { # Wen wollen wir aendern?
print $q->p('Name der zu bearbeitenden Person: ',
$q->textfield(-name => "name", -size => 30, -maxlength => 255,
-default => '', -override => 1));
}
} else { # OK, Startauswahl
print $q->start_form();
print $q->p('Aufgabe: ', $q->radio_group(-name => "kind",
-values => [keys %kinds], -labels => \%kinds, -default => 'search'));
print $q->p('Passwort: ', $q->password_field(-name => "pwd", -size => 8,
-maxlength => 8, -default => '')); #Achtung: Nur eine Pruefung
}
print $q->hidden(-name => 'kind', -value => $kind);
print $q->submit(), $q->end_form(), "\n";
print $q->hr(), "Ingo Melzer", $q->end_html;
$db->disconnect;
Ingo Melzer, 30. Mai 2002