Klaus Mock: Datenbank Zugriff via CGI und Formularen

Beitrag lesen

Hallo,

Angenommen, meine Datenbank ist SQL kompatibel, wie realisiere ich die Webanbindung?

Du machst ein Suchformular, welches ein Script auf dem Server kontaktiert, das wiederum in der Datenbank sucht, und diese Ergebnisse in gewünschter Form per HTML an den Browser zurücksendet.

Geht so etwas mit Perl und wie groß ist der damit verbundene Aufwand?

Sicherlich. Verwendete Bestandteile sind zumeist CGI (für die Formularauswertung), DBI(Allgemeines Interface zu Datenbanken), DBD::* (Datenbankspezifische Module zu DBI), und das ganze wird dann kombiniert.
Eventuell siehst Du Dir noch Module aus der DBIx::-Reihe an, wie zum Beispiel DBIx::HTMLView an.

Hat jemand vielleicht schon damit Erfahrung?

Bei mir (und sicherlich vielen anderen) funktioniert das wunderbar.

Kennt jemand (eventuell frei verfügbare) Dokumentationen zu diesem Thema (Online oder Hardcopy)?

Da sind zum einen diverse O'Reilly-Bücher, http://search.cpan.org (hier kannst Du die Module finden, bzw. deren Dokumentationen lesen)

Unter </selfaktuell/artikel/cgiperl/odbc/index.htm> findest Du eine Anleitung, wie man das ganze mit Win32::ODBC macht, allerdings würde ich empfehlen, anstelle Win32::ODBC doch die DBI-Module zu verwenden.

Grüße
  Klaus

PS.: hier ein kleines Beispiel, wie soweas mit DBI aussehen kann:

#!/usr/bin/perl -w

use CGI;
use DBI;

use strict;
my ($key, $href, $ishead);

my $query = new CGI;

print $query->header();

das ist natuerlich kein realer connect, da d

my $dbh = DBI->connect('dbi:ODBC:myDSN','username','password') or exitWithError($ishead,'DB-Connect', $DBI::errstr);
#hier sollte das richtige Selectstatement hin und mit einer passenden where-Klausel versehen werden, um die Suche zu realisieren
my $sth = $dbh->prepare('select * from tabelle') or exitWithError($ishead,'DB-prepare', $DBI::errstr);
$sth->execute or exitWithError($ishead,'DB-execute', $DBI::errstr);
my $names = $sth->{NAME};
print "<html><body>\n";
$ishead=1;
#ab hier ist eine einfache tabellarische ausgabe realisiert, welche auch anders aussehen kann;-)

print "<table border=1 cellspacing=0><tr bgcolor=silver>\n";
foreach $key (@$names)
 {
 print "<th>$key</th>\n";
 }
print "</th>\n";
while($href =  $sth->fetchrow_hashref)
 {
 print "<tr>\n";
 foreach $key ( @$names)
   {
   if(defined $href->{$key})
    {
    print "<td NOWRAP>$href->{$key} </td>\n" ;
    }
   else
    {
    print "<td NOWRAP> </td>\n" ;
    }

}
 print "</td>\n";
 }

print "</table></body></html>\n";
#ende der ausgabe

$sth->finish or exitWithError($ishead,'DB-finish', $DBI::errstr);
$dbh->disconnect or exitWithError($ishead,'DB-disconnect', $DBI::errstr);
exit;

sub exitWithError
{
my($ishead,$function,$error) = @_;
unless($ishead)
 {
 print "<html><body>";
 }
print "Ein Fehler ist aufgetreten bei $function: <br>$error</body></html>";
exit;

}