Tobias Weisserth: Datenbank Zugriff via CGI und Formularen

Guten Tag meine lieben Helferlein ;-)

Folgendes möchte ich bewerkstelligen:

Eine Datenbank mit bis zu 150 Datensätzen und etwa 13 bis 15 Felder pro Datensatz, Inhlat überwiegend Text, ab und zu mal ein URL.

Nun sollen alle Felder aller Datensätze mittels eines Formulares durchsuchbar sein nach Schlüsselbegriffen. Nach durchgeführter Suche sollen die entsprechenden Datensätze in einer Liste (nach einem bestimmten Feld sortiert) dargestellt werden. Einzelne Datensätze dieser Liste sollen wählbar sein, so dass bei Anklicken alle Datenfelder einsichtbar sind.

Angenommen, meine Datenbank ist SQL kompatibel, wie realisiere ich die Webanbindung? Geht so etwas mit Perl und wie groß ist der damit verbundene Aufwand? Hat jemand vielleicht schon damit Erfahrung? Kennt jemand (eventuell frei verfügbare) Dokumentationen zu diesem Thema (Online oder Hardcopy)?

Ich freue mich über Eure Antworten,

Danke,
Tobias Weisserth

  1. Folgendes möchte ich bewerkstelligen:

    Eine Datenbank mit bis zu 150 Datensätzen und etwa 13 bis 15 Felder pro Datensatz, Inhlat überwiegend Text, ab und zu mal ein URL.

    Nun sollen alle Felder aller Datensätze mittels eines Formulares durchsuchbar sein nach Schlüsselbegriffen. Nach durchgeführter Suche sollen die entsprechenden Datensätze in einer Liste (nach einem bestimmten Feld sortiert) dargestellt werden. Einzelne Datensätze dieser Liste sollen wählbar sein, so dass bei Anklicken alle Datenfelder einsichtbar sind.

    Angenommen, meine Datenbank ist SQL kompatibel, wie realisiere ich die Webanbindung? Geht so etwas mit Perl und wie groß ist der damit verbundene Aufwand? Hat jemand vielleicht schon damit Erfahrung? Kennt jemand (eventuell frei verfügbare) Dokumentationen zu diesem Thema (Online oder Hardcopy)?

    Also man macht sowas mit CGI !! Näheres findest du dazu in SelfHTML, einfach beid er Suche CGI eingeben. Hier nur soviel. CGI ist eine Kommunikationsmöglochkeit zwischen dem einzelnen User und dem Server. Der User schreibt Daten in die Standardeingabe (stdin) - zB durch betätigen eines Links und ein entsprechendes CGI-Skript schreibt nach erfolgreicher abarbeitung wieder was auf die Standardausgabe. Der Name CGHI Skript ist nicht gnaz korrekt hat sich aber eingebürgert, da meist Skriptsprachen wie Perl dazu verwendet werden. Prinzipiell sind alle Sprachen geeignet die von stdin lesen und auf sdtout schreiben können !!

    Viel Spass damit ... Starbuck

    1. Danke für die Antwort. Die war etwas allgemein. Dass ich CGI verwenden muss, ist mir schon klar. Ich dachte mehr daran, welche der vielen Möglichkeiten mit dem geringsten Aufwand verbunden ist: Perl, PHP, ASP etc.
      Unter Perl gibt es doch schon fertige Module zur SQL Anbindung, oder?
      Vielleicht hat jemand auch schon entsprechende Suchalgorithmen geschrieben, so dass ich nicht überall das Rad neu erfinden muss. Schließlich handelt es sich dich um eine alltägliche Anwendung, die man desöfteren im WWW zu sehen bekommt.
      Wer mir da also etwas spezifischer unter die Arme greifen kann, dem wäre ich sehr dankbar... ;-)

      freundliche Grüße an die hilfsbereite Riege
      Tobias Weisserth

      Folgendes möchte ich bewerkstelligen:

      Eine Datenbank mit bis zu 150 Datensätzen und etwa 13 bis 15 Felder pro Datensatz, Inhlat überwiegend Text, ab und zu mal ein URL.

      Nun sollen alle Felder aller Datensätze mittels eines Formulares durchsuchbar sein nach Schlüsselbegriffen. Nach durchgeführter Suche sollen die entsprechenden Datensätze in einer Liste (nach einem bestimmten Feld sortiert) dargestellt werden. Einzelne Datensätze dieser Liste sollen wählbar sein, so dass bei Anklicken alle Datenfelder einsichtbar sind.

      Angenommen, meine Datenbank ist SQL kompatibel, wie realisiere ich die Webanbindung? Geht so etwas mit Perl und wie groß ist der damit verbundene Aufwand? Hat jemand vielleicht schon damit Erfahrung? Kennt jemand (eventuell frei verfügbare) Dokumentationen zu diesem Thema (Online oder Hardcopy)?

      Also man macht sowas mit CGI !! Näheres findest du dazu in SelfHTML, einfach beid er Suche CGI eingeben. Hier nur soviel. CGI ist eine Kommunikationsmöglochkeit zwischen dem einzelnen User und dem Server. Der User schreibt Daten in die Standardeingabe (stdin) - zB durch betätigen eines Links und ein entsprechendes CGI-Skript schreibt nach erfolgreicher abarbeitung wieder was auf die Standardausgabe. Der Name CGHI Skript ist nicht gnaz korrekt hat sich aber eingebürgert, da meist Skriptsprachen wie Perl dazu verwendet werden. Prinzipiell sind alle Sprachen geeignet die von stdin lesen und auf sdtout schreiben können !!

      Viel Spass damit ... Starbuck

  2. 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;

    }

    1. Hallo Klaus,

      Danke für die Antwort. Das gibt mir schon einaml einen ersten Eindruck, wie das ganze aussehen könnte.

      Gruß,
      Tobias

      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;

      }