[Thread Prev][Thread Next]   >Date Index >Thread Index

Re: Datenbank - Web-Formular - Perl + DBI

Renée Bäcker - Sun Jan 28 17:28:11 2007


Hallo Stefan,

Stefan Bauer schrieb:
Hallo Liste,

um mich kurz vorzustellen, ich heiße Stefan und komme aus der Nähe von
Traunstein (ja noch Bayern!).

Aus eigenem Interesse an Perl wende ich mich heute mit einem Problem
an euch.

ich bin auf der Suche nach einer vernünftigen sowie skalierbaren
Möglichkeit, über ein Web-Formular Daten einzutragen, (Name, Vorname,
Postleitzahl, Ort, Alter) welches im Anschluss die Werte in einer
MySQL Datenbank ablegt. Wichtig ist nun, dass ich über eine
zusätzliche Maske nach der Postleitzahl suchen kann und ich alle
Treffer angezeigt bekomme.

Für solche Sachen nehme ich ganz gerne CGI::Application in Verbindung mit HTML::Template::Compiled. Das ist zwar nicht so mächtig wie andere Templating-Systeme, sollte aber hierfür ausreichen.

HTML::Template::Compiled ist sehr ähnlich zu HTML::Template. Wenn Dich das interessiert, kannst Du Dir ja mal http://perl.renee-baecker.de/HTML_Template.pdf und http://perl.renee-baecker.de/HTML_TemplateII.pdf anschauen.

Zum Thema DBI kannst Du Dir ja mal das PDF unter http://www.foo-magazin.de/download.cgi anschauen.

Im Bereich Web habe ich keinerlei Erfahrungen mit Perl und bewege mich
hier auf Neuland zu. Schön wäre hier evtl. von ein paar
Erfahrungsberichten zu hören oder sogar ein Beispiel zu sehen, was mir
bei der Umsetzung helfen würde.

ungetestet:

index.tmpl

<html>
<body>
 <form action="<!-- TMPL_VAR NAME=ACTION -->" method="post">
   <table>
     <tr>
       <td>Name</td>
       <td><input type="text" name="person"></td>
     </tr>
     <tr>
       <td>Postleitzahl</td>
       <td><input type="text" name="plz"></td>
     </tr>
   </table>
   <input type="hidden" name="action" value="insert">
   <input type="submit" value="eintragen">
 </form>
 <a href="?action=search">Suche</a>
</body>
</html>

search.tmpl

<html>
<body>
 <form action="<!-- TMPL_VAR NAME=ACTION -->" method="post">
   <table>
     <tr>
       <td>Postleitzahl</td>
       <td><input type="text" name="plz"></td>
     </tr>
   </table>
   <input type="hidden" name="action" value="do_search">
   <input type="submit" value="eintragen">
 </form>
</body>
</html>

result.tmpl

<html>
<body>
   <table>
     <tr>
       <td>Postleitzahl</td>
       <td>Name</td>
     </tr>
     <!-- TMPL_LOOP NAME=PERSONS -->
     <tr>
       <td><!-- TMPL_VAR NAME=PLZ --></td>
       <td><!-- TMPL_VAR NAME=PERSON --></td>
     </tr>
     <!-- /TMPL_LOOP -->
   </table>
</body>
</html>


index.cgi:
#!/usr/bin/perl

use strict;
use warnings;
use CGI::Carp qw(fatalsToBrowser);
use lib qw(.);
use YellowPages;

my $webapp = YellowPages->new();
$webapp->run();

YellowPages.pm:

package YellowPages;

use strict;
use warnings;

use base ('CGI::Application::Plugin::HTCompiled','CGI::Application');
use lib qw(.);
use FindBin ();
use DBI;

sub setup{
   my ($self)  = @_;
   my $bin_dir = $FindBin::Bin;
   $self->{action}   = 'http://localhost/cgi-bin/index.cgi';
   $self->{dir}      = $bin_dir;
   $self->{dbh}      = DBI->connect("DBI:mysql:db:host","xxx","xxx")
                                    or die $DBI::errstr;
   $self->start_mode('index');
   $self->mode_param('action');
   $self->run_modes(index     => \&start,
                    search    => \&search,
                    insert    => \&insert,
                    do_search => \&do_search,);
}

sub start{
   my ($self) = @_;
my $tmpl = $self->load_tmpl('index.tmpl');
   $tmpl->param(ACTION => $self->{action},);
   return $tmpl->output();
}

sub insert{
   my ($self) = @_;
my $cgi = $self->query();
   my %params = $cgi->Vars();
my $stmt = q~INSERT INTO persons VALUES(?,?)~;
   $self->{dbh}->do($stmt,undef,@params{qw/plz person/});
my $tmpl = $self->load_tmpl('index.tmpl');
   $tmpl->param(ACTION => $self->{action},);
   return $tmpl->output();
}

sub search{
   my ($self) = @_;
my $cgi = $self->query();
   my %params = $cgi->Vars();
my $tmpl = $self->load_tmpl('search.tmpl');
   $tmpl->param(ACTION => $self->{action},);
   return $tmpl->output();
}

sub do_search{
   my ($self) = @_;
my $cgi = $self->query();
   my %params = $cgi->Vars();
my $stmt = q~SELECT * FROM persons WHERE plz = ?~;
   my $sth    = $self->{dbh}->prepare($stmt);
my @result; while(my ($name,$plz) = $sth->fetchrow_array()){
       push @result, {PLZ => $plz, PERSON => $name};
   }
my $tmpl = $self->load_tmpl('result.tmpl');
   $tmpl->param(PERSONS => \@result);
   return $tmpl->output();
}

Danke im Voraus




--
renee.baecker@smart-websolutions.de
http://www.smart-websolutions.de

Smart-Websolutions André Windolph und Renée Bäcker GbR
Maria-Montessori-Str. 13
64584 Biebesheim

USt.-ID: DE228935695


Next: