Jan Runte: Datenbanken (zeilenweise)

Hallo zusammen.

ich habe vor kurzem mit CGI-Skripten angefangen, und habe mir die
Dokus über CGI/Perl durchgelesen, soweit ich Sie durchschauen konnte.
Diese auf die Server zu replizieren, habe ich gepeilt, aber neulich
wollte ich eine kleine Datenbank (zeilenbasiert) realisieren (ich habe
nichts näheres darüber in den Dokus gefunden) und denke aber hoffentlich
auch theoretisch richtig angefangen zu haben, aber im praktischem
Sinne...hackt 's so n bisschen und der Server spuckt mir das sogenannte
Ergebnis nicht heraus. Könnt Ihr mir beim Skript weiterhelfen??

Vielen Dank auch im voraus.

bye jR. --> Sourcen...

:index.html
<html><body>
<form method="post" action="../cgi-bin/suchen.cgi" type="submit">
<input name="suchen">
<input type="submit">
</form>
</body></html>
:ende

:suchen.cgi
#!/usr/bin/cgi-bin
$basedir = "$ENV{DOCUMENT_ROOT}/suchen";
$inifile = "titel.ini";

#Variabel "suchen" vom Formular merken
@search = "$FORM{'suchen'}";

@titel = "";
@text = "";
@autor = "";
@dummy = "";

open(DATABASE, "<$basedir/§inifile");
do
{
#Zeilen lesen
$titel;
$text;
$autor;
$dummy;
}
until (<DATABASE> && $titel == $search)
close(DATABASE);

if ($titel == $search)
{
print "<html><body>";
print "Titel wurde gefunden.<br><br>";
print "<b>Titel:</b> $titel<br>";
print "<b>Text:</b><br>";
print "$text<br>";
print "<br><b>Autor:</b> $autor";
print "</body></html>";
}
else
{
print "<html><body>Der Titel wurde nicht gefunden!</body></html>";
}
:ende

:titel.ini
Blabla
Hallo und so.
jR

Blasülz
Test
dF

.
.
.

.
.
.
:ende

  1. Hallo,

    fangen wir mal mit der Datenbank als Textfile an.
    Vorschlag: CSV-Datei. Die könntest Du wie folgt aufbauen:
    titel;text;autor;dummy
    (Eine solche Tabelle kannst Du auch mit Excel erzeugen und bearbeiten)
    Das gäbe zeilenweise "Records" in denen die Felder mit ";" getrennt sind.

    Eine solche Tabelle kannst Du wie folgt mit PERL lesen:
    Beispiel:
    open(CSV, $tabelle);
    while(<CSV>){
    chomp ($_); # Zeilenumbrüche abschneiden
    push (@zeilen, $_);
    }
    close (CSV);
    Damit wird die Tabelle auf ein Array "@zeilen" gelesen.

    Um an die Felder zu kommen, gibt es die Funktion split(), geht z.B. so:
    Beispiel:
    for(@zeilen){
    ($titel, $text, $autor, $dummy) = split (/;/,$_);
    print "Titel: $titel Text: $text Autor: $autor Dummy: $dummy\n";
    }

    Die beiden Beispiele sollten erst einmal die Grundfunktion zeigen... vielleicht hilft das Dir schon weiter.

    Viele Grüße, Rolf

    1. Hallo,

      Hallo.

      fangen wir mal mit der Datenbank als Textfile an.
      Vorschlag: CSV-Datei. Die könntest Du wie folgt aufbauen:
      titel;text;autor;dummy
      (Eine solche Tabelle kannst Du auch mit Excel erzeugen und bearbeiten)
      Das gäbe zeilenweise "Records" in denen die Felder mit ";" getrennt sind.

      Eine solche Tabelle kannst Du wie folgt mit PERL lesen:
      Beispiel:
      open(CSV, $tabelle);
      while(<CSV>){

      »»  chomp ($_); # Zeilenumbrüche abschneiden
      »»  push (@zeilen, $_);

      }
      close (CSV);
      Damit wird die Tabelle auf ein Array "@zeilen" gelesen.

      Um an die Felder zu kommen, gibt es die Funktion split(), geht z.B. so:
      Beispiel:
      for(@zeilen){

      »»  ($titel, $text, $autor, $dummy) = split (/;/,$_);
      »»  print "Titel: $titel Text: $text Autor: $autor Dummy: $dummy\n";

      }

      Die beiden Beispiele sollten erst einmal die Grundfunktion zeigen... vielleicht hilft das Dir schon weiter.

      Viele Grüße, Rolf

      mein Skript war vorhin wohl mit ein paar fatalen Fehler bestückt.
      ich hab' das jetzt mal nachvollzogen...und hab' nix verstanden ~:-]
      und mein Test-Skript hab' ich dann mal *versucht* mit Deinen
      zu vermischen, so wie ich es für logisch halte würde, und mal eine
      Ebene weiter gedacht, wofür ich das einxlich brauche...funktioniert
      aber noch nicht so ganz.

      :regisseure.cgi
      #!/usr/bin/cgi-bin
      $basedir = "$ENV{DOCUMENT_ROOT}/regisseure";
      $baseurl = "http://www.little-wing-imagine.de/regisseure";
      $cgi_url = "http://www.little-wing-imagine.de/cgi-bin/regisseure.cgi";

      $inifile = "regisseure.csv";

      @searching = "$suchen";
      @name = "";
      @search = "";
      @realname = "";
      @picture = "";
      @portrait = "";
      @gort = "";
      @gtag = "";
      @szeichen = "";
      @sbild = "";
      @cstern = "";

      open(CSV, "<$basedir/$inifile");
      while(<CSV> $searching eq $name)
      {
      chop($_);
      push(@zeilen, $_);
      for(@zeilen)
      {
        ($name, $realname, $picture, $portrait, $gort, $gtag, $szeichen, $sbild, $cstern) = split (/;/,$_);
      }
      }
      close (CSV);

      if ($searching == $name)
      {
      print "<html><body>";
      print "Regisseur: $realname<br>";
      print "Picture: $picture<br>";
      print "Portrait: $portrait<br>";
      print "Geburtsort: $gort<br>";
      print "Geburtstag: $gtag<br>";
      print "Sternzeichen: $szeichen<br>";
      print "Sternbild: $sbild<br>";
      print "Stern: $cstern<br>";
      print "</body></html>";  
      }
      else
      {
      print "<html><body>Wurde nicht gefunden!</body></html>";
      }
      :ende

      nunja. Guckt mal was ich da so für nen Mist verzapft habe. Wird
      wohl noch ne weile dauern bis ich CGI/Perl verstehe...bis dahin
      wäre ich aber sehr dankbar auf ein paar Hilfen von Euch.

      bye jR.

      1. Hallo Jan,

        ein paar Hilfen - OK. Deine Idee an sich ist auch OK und so eine Suche in ASCII-Files ist gar nicht so schwer zu realisieren mit PERL.
        Aber Deinen Postings entnehme ich, dass die ganze Geschichte vielleicht für den Anfang etwas zu komplex ist.

        Meine Hilfe nun: Ich darf Dich durchaus noch einmal auf mein Erstes Posting verweisen und auch auf das Posting vom Frank.
        Bitte befass Dich erst einmal mit dem Thema "Datei öffnen und Lesen" Du findest dazu auch in SELFHTML/PERL/CGI einige Beispiele.

        Zu Deinem Skript halte ich auch noch zwei Hinweise für notwendig:

        1. In Zeile 1 schreibst Du
        #!/usr/bin/cgi-bin
        -> Hier gehört unter Unix der Pfad zum PERL-Interpreter hin (unter UNIX allgemein der Pfad zur Shell) unter Windows wird diese Zeile ignored. Steht Dein PERL-Interpreter in diesem Verzeichnis?

        2. Weiter unten schreibst Du
        $basedir = "$ENV{DOCUMENT_ROOT}/regisseure";
        -> Steht nach Dieser Zuweisung in "$basedir" tatsächlich ein Pfad drin?
        -> Beachte bitte auch, dass Dateien mit PERL nur lokal, also auf dem Server zu öffnen sind.

        Nunja, sieh das hier alles mal bitte konstruktiv.

        Viele Grüße, Rolf

        1. Hallo Jan,

          Hallo Rolf.

          ein paar Hilfen - OK. Deine Idee an sich ist auch OK und so eine Suche in ASCII-Files ist gar nicht so schwer zu realisieren mit PERL.
          Aber Deinen Postings entnehme ich, dass die ganze Geschichte vielleicht für den Anfang etwas zu komplex ist.

          bin n Senkrechtstarter. Kann vielleicht manchmal schief gehen.

          Meine Hilfe nun: Ich darf Dich durchaus noch einmal auf mein Erstes Posting verweisen und auch auf das Posting vom Frank.
          Bitte befass Dich erst einmal mit dem Thema "Datei öffnen und Lesen" Du findest dazu auch in SELFHTML/PERL/CGI einige Beispiele.

          Vorher habe ich unter "SELFHTML/PERL/CGI" nachgeguckt, konnte aber die Befehle
          nicht auseinander halten, die in den Beispielen standen - welcher Befehl was macht
          und wie man den mit anderen in Verbindung setzten kann o.ä.

          Zu Deinem Skript halte ich auch noch zwei Hinweise für notwendig:

          1. In Zeile 1 schreibst Du
            #!/usr/bin/cgi-bin
            -> Hier gehört unter Unix der Pfad zum PERL-Interpreter hin (unter UNIX allgemein der Pfad zur Shell) unter Windows wird diese Zeile ignored. Steht Dein PERL-Interpreter in diesem Verzeichnis?

          2. Weiter unten schreibst Du
            $basedir = "$ENV{DOCUMENT_ROOT}/regisseure";
            -> Steht nach Dieser Zuweisung in "$basedir" tatsächlich ein Pfad drin?
            -> Beachte bitte auch, dass Dateien mit PERL nur lokal, also auf dem Server zu öffnen sind.

          ich habe meinen Webmaster bei meiner ersten Replizierung nach Configs in CGI-Skripten
          gefragt, und der sagte mir dann, daß ich auf jeden Fall

          #!/usr/bin/cgi-bin am Anfang
          $ENV{DOCUMENT_ROOT} im $basedir

          benutzen soll, sonst könnte es nicht funktionieren. Dann wars auch so.
          Ich benutze im Moment auch keinen Interpreter dafür - teste alles "life"...

          Nunja, sieh das hier alles mal bitte konstruktiv.

          Viele Grüße, Rolf

          Danke für die Hilfe. bye jR.

          1. Hallo Jan,

            na wenn das so ist, muss ich mich doch noch einmal melden... also was Dein Webmaster sagt, ist die eine Sache da häng ich mich nicht weiter rein.

            Aber:

            Ich benutze im Moment auch keinen Interpreter dafür - teste alles "life"...

            Nenene -> schalte mal um zum localhost! IP=127.0.0.1 ...ist preiswerter zum Testen. Auf Deinem eigenem Rechner kannst Du ohne Onlinekosten Sripte entwickeln und testen!
            Wie's geht, steht auch in SELFHTML <../../tgb.htm>

            Also: es ist kein Problem, auf Deinem lokalem Rechner zu installieren:
            PERL http://www.activestate.com/
            einen WebServer z.B.: OmniHttpd (hast Du Windows?)
            siehe http://www.omnicron.ab.ca/httpd/

            Ein guter Link noch zu PERL http://www.phy.uni-bayreuth.de/~btpa25/perl/perl_inhalt.html -> auch mit Downloadmöglichkeit.

            Viele Grüße, Rolf

            PS: Senkrechtstarter? Starte mal mit einer Boeing 767! Geht nicht schief! Meine schönsten Starts....

  2. hi!

    Es gibt einen Unterschied zwischen haken und hacken, das sind zwei völlig verschiedene Dinge.

    #!/usr/bin/cgi-bin

    #!/usr/bin/perl

    #Variabel "suchen" vom Formular merken
    @search = "$FORM{'suchen'}";

    Äh. Das steht aber nicht wirklich so alleine in deinem Skript, oder?

    open(DATABASE, "<$basedir/§inifile");

    $inifile wäre hier wohl passender. Perl erkennt Skalare so schlecht, wenn sie durch ein §-Zeichen eingeleitet werden.

    do
    {

    [...]

    }
    until (<DATABASE> && $titel == $search)

    Da fehlen einerseits vermutlich die Klammern und andererseits wird sich dein Perl-Skript nie mehr beenden, wenn dein Suchbegriff nicht gefunden wird. Strings werden übrigens in Perl mit "eq" verglichen.

    Also: vielleicht postest du nochmal dein wirkliches Skript, ohne vorher Teile daraus abzuschreiben und den Rest wegzulassen. Schon mal was von Copy'n'Paste gehört?

    bye, Frank!