Sven: programmunterseiten in cgi

Ich habe (nachdem ich das nötige wissen in perl habe) vor mir mit cgi ein gästebuch zu basteln. Jetzt bin ich schon soweit das man mir einträge schreiben kann sie gespeichert werden und ich auch wieder ausgeben kann!

Ich habe jede erdenkliche seite über cgi nach meinem problem abgesucht (auch auf selfhtml und hier im forum) leider find ich nichts deshalb hoffe ich ihr könnt mir helfen!?!?

1. Ich habe in meinem verwaltungsprogramm bzw. adminbereich mehrere funktionen eingebaut (Eintrag löschen, eintrag ändern, spamschutz usw)
Jede funktion liegt in einer sogenannten subrutine und soll nacheinander aufgerufen werden. Aber anstatt eine neue Seite zu laden wird der inhalt der subrutine unten angefügt. EIn beispielskript soll das vielleicht besser erklären könne:

$q->header();
$q->start_html;
print "Verwaltung";
print '<a href="verwaltung?gehezu=eintragloeschen">';
$q->end_html;

if($gehezu eq "eintragloeschen)
{
eintragloeschen();
}

sub eintragloeschen
{
$q->start_html;
print "Welcher eintrag soll gelöscher werden?";
$q->end_html;
}

Wenn ich aber zu der subrutine eintragloeschen klicke wird er eintrag unter der Verwaltung und dem link angezeigt ich möchte aber für jede subroutine ein ganz eigenes fenster haben ohne ein weiteres skript (bspw. eintragloeschen.pl) aufrufen zu müssen.
Ich hoffe ihr wisst was ich will?

2. Wie schaffe ich es das ich auf meinem gästebuch mehr seiten auswählen kann? also nach 10 einträgen sollte man zur nächsten seite gehen können und immer so weiter ohne das ich auch hier ein neues skript (bspw. seite2.pl)  aufrufen muss?

  1. Hallo Sven!

    Nur der zweite Punkt ist eine Perl-Frage...

    print '<a href="verwaltung?gehezu=eintragloeschen">';

    Wenn ich aber zu der subrutine eintragloeschen klicke wird er eintrag unter der Verwaltung und dem link angezeigt

    Erst mal lernen wir, das Problem zu beschreiben... ;)

    Man kann nicht in eine Subroutine klicken ;) Höchstens auf einer Webseite auf einen Link klicken, der durch angehängte, entsprechende Parameter eben eine entsprechende Subroutine aufruft - was Du ja auch schon machst, nur erklären müsstest Du es besser.

    ich möchte aber für jede subroutine ein ganz eigenes fenster haben ohne ein weiteres skript (bspw. eintragloeschen.pl) aufrufen zu müssen.

    Perl wird Dir keine neuen Browserfenster öffnen, weil Perl gar nichts von Browserfenstern weiß. Dies musst Du in der HTML-Ausgabe entsprechend angeben: und zwar, was beim Klick auf einem Link passieren soll. Ob du hier mit target="_blank" arbeitest (transitional-Doctype vorausgesetzt) oder eine JavaScript-Lösung in die Ausgabe einarbeitest, bleibt Dir überlassen.

    1. Wie schaffe ich es das ich auf meinem gästebuch mehr seiten auswählen kann? also nach 10 einträgen sollte man zur nächsten seite gehen können und immer so weiter ohne das ich auch hier ein neues skript (bspw. seite2.pl)  aufrufen muss?

    Für den Aufruf: Wenn Du schon Parameter übergeben und verarbeiten kannst, wo ist das Problem? So könnte es aussehen:

    gb.pl?page=x

    Deine Subroutine für die Anzeige der Einträge muss die vorhandenen Einträge zählen, durch zehn »modulo«-dividieren, solange zehn ausgeben bis eine Zahl kleiner oder gleich 10 erreicht ist - das ist dann die letze Seite.

    Nach 10 Einträgen verlinkst Du auf die 10 nächsten, wie eben angegeben:

    <a href=".../gb.pl?page=2">Seite 2</a>

    Ich denke, das sind schon Stichworte, mit welchen Du schon anfangen kannst. Bei Problemen einfach weiter Fragen (oder auf einen der Link hier unten klicken, so eine Lösung habe ich auch in meinem GB *g*).

    Viele Grüße aus Frankfurt/Main,
    Patrick

    --

       Diblom
    _ - jenseits vom delirium - _
    [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
    Nichts ist unmöglich? Doch!
    Heute schon gegökt?
    1. Hi Patrick. Danke für deine Antwort.

      Ich hab gerade keine Zeit auf mein erstes Problem genauer einzugehen aber das zweite Problem ist mir noch sehr unklar.

      Ich habe erstmal dein Gästebuch ugb runtergeladen und angeschaut. Erstmal respekt nur für mich etwas zu durcheinander mit den ganzen arrays und variablen hehe.
      Also ich muss eine foreach schleife öffnen die einträge dividieren und die ersten 10 oder mehr ausgeben. Das mach ich mit modulo-dividieren da nur eine ganze zahl rauskommen kann.
      Aber was dann passieren soll versteh ich überhaupt nicht. Gibt es vielleicht eine seite wo das ganz genau erklärt wird oder was ich das stichwort dafür?

      1. Hallo Sven!

        Ich habe erstmal dein Gästebuch ugb runtergeladen und angeschaut. Erstmal respekt nur für mich etwas zu durcheinander mit den ganzen arrays und variablen hehe.

        Der Code ist generalüberholungsbedürftig und nutzt veraltete Schreibweisen, vor allem, was der Subroutinenaufruf angeht. Also deswegen nicht 1:1 übernehmen. Ich habe nun keinen Nerv und vor allem nicht die Zeit im Moment, das GB neu zu schreiben, das wollte ein anderer Forumsleser hier übernehmen ;)

        Auch solltest Du use strict; nutzen, die Variablen mit my deklarieren und wenn Du auch Templates einsetzt, dann das Modul HTML::Template einbinden.

        Also ich muss eine foreach schleife öffnen die einträge dividieren und die ersten 10 oder mehr ausgeben. Das mach ich mit modulo-dividieren da nur eine ganze zahl rauskommen kann.
        Aber was dann passieren soll versteh ich überhaupt nicht.

        Das ugb benutzt keine Datenbank, sondern eine einfache Textdatei. Jeder Gästebucheintrag entspricht einer Zeile dieser Datei. Andersrum: Hat die Datei 47 Zeilen, sind 47 Einträge vorhanden.

        Die Modulo-Division durch 10 gibt Dir die Anzahl der Einträge der letzten Seite:

        47 % 10 -> 7

        Das bedeutet: vier Seiten à 10 Einträge plus eine à 7 = 5 Seiten. Deine Subroutine muss das also ermitteln.

        $count = # Zeilen der Datei.  
        $lasts = $count % 10;            # modulo-Division (ergibt Einträge  
                                         # der letzen Seite)  
        $pages = ($count - $lasts) /10;  # Ermittlung der ...  
        $pages++ if $lasts > 0;          # ...Seitenzahl
        

        ^^ Die letzte Zeile ist hier wichtig: wenn die Modulo-Division mehr als "0" ergibt (wie das bei 47 Zeilen der Fall ist), wird $pages um 1 erhöht (es gibt dann 5 Seiten). Wenn das Ergebnis 0 ist, haben wir eine Anzahl von Seiten die durch 10 teilbar ist (bei nur 40 Einträgen wäre der Wert von $pages "4").

        Reicht es für den Anfang?

        Viele Grüße aus Frankfurt/Main,
        Patrick

        --

           Diblom
        _ - jenseits vom delirium - _
        [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
        Nichts ist unmöglich? Doch!
        Heute schon gegökt?
        1. Hi Patrick. Danke nochmals für deine Antwort.

          Ich habe das gefühl das mir das im moment noch zu hoch ist deshalb hab ich mal mit etwas ganz ganz simplen angefangen und zwar will ich eine datei ausgeben und zum beispiel nach jeder zehnten zeile ein hallo ausgeben aber das klappt nicht.

          open (DAT, "<datei.txt");
          my @dat = <DAT>;
          my $datei;
          for $datei (@dat)
          {
          print $datei;
          if ($datei % 5 > 0)
          {
          print "hallo";
          }
          }

          Das geht aber nicht nur warum nicht?

          Das hingegen geht:

          my $zahl;
          for $zahl (1..50)
          {
          print "$zahl\n";
          if ($zahl % 5 > 0)
          {
          print "hallo";
          }
          }

          Wäre lieb von dir wenn du mir weiterhelfen könntest.

          ps: Hab den code bisschen geändert hoffe es liegt nicht daran??

          1. open (DAT, "<datei.txt");

            hier empfiehlt es sich immer zu prüfen ob das öffnen geklappt hat und im Fehlerfall eine entsprechende Meldung auszugeben:

            open (DAT, '<', 'datei.txt') || die "Kann datei.txt nicht öffnen, weil: $!";

            my @dat = <DAT>;

            Das solltest du nur machen, wenn du weißt, dass die Datei nicht gross wird, weil das leist die Datei komplett ein. Besser ist meistens

            while(<DAT>){  
            ...  
            }  
            
            

            my $datei;
            for $datei (@dat)
            {
            print $datei;
            if ($datei % 5 > 0)

            $datei enthält die aktuelle Zeile, du willst aber die Zeilennummer, diese kannst du hier nur mit einem Zähler ermitteln. Wenn du die while Variante nimmst, kannst du auf $. zugreifen.

            Das sähe z.b. so aus:

            #!/usr/bin/perl -w  
            use strict;  
            my $datei = 'test.txt';  
            open (DAT, '<', $datei) || die "Kann *$datei* nicht öffnen, weil: $!";  
            while(<DAT>){  
             print $_;  
             unless($. % 5){  
              print "Hallo!\n";  
             }  
            }  
            
            

            Struppi.

            1. Hallo Struppi!

              Oh Mist, ich habe eine halbe Stunde gebraucht, um mein Posting abzuschicken (zwischendurch Frühstück für Patenkindchen gemacht). Hätte ich gesehen, dass Du geantwortet hast (mache ich sonst immer, wenn ich aus irgendwelchen Gründen nicht aus einem Stück verfassen kann), hätte ich's mir sparen können :)

              Deine Antwort ist viel kompletter!

              Viele Grüße aus Frankfurt/Main,
              Patrick

              --

                 Diblom
              _ - jenseits vom delirium - _
              [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
              Nichts ist unmöglich? Doch!
              Heute schon gegökt?
              1. Deine Antwort ist viel kompletter!

                wird aber sicher noch viele Fragen offen lassen. So wie es aussieht steht Sven noch ziemlich am Anfang. Da kommt bestimmt noch was für dich ;-)

                Ausserdem kann ich nach einer Woche ohne DSL mich seit heute endlich wieder ausführlich im Forum tummeln :-)

                Struppi.

                1. Hallo Struppi!

                  wird aber sicher noch viele Fragen offen lassen. So wie es aussieht steht Sven noch ziemlich am Anfang. Da kommt bestimmt noch was für dich ;-)

                  Ach, irgendwie habe ich den Eindruck, ich kann überhaupt nichts mehr (habe seit ca. dem Zeitpunkt, wo ich wegen meines Date::Today-Moduls gepostet hatte, nichts mehr mit Perl gemacht - statt dessen kämpfe ich jetzt mit CSS und ich sage Dir: Eigentlich perle ich lieber, da weiß man, was man erhält und kein dummer Browser pfuscht dazwischen).

                  Ausserdem kann ich nach einer Woche ohne DSL mich seit heute endlich wieder ausführlich im Forum tummeln :-)

                  Hier waren wir letztens 2 Tage (fast) ohne alles: Kein Telefon (also kein DSL), kein Fernsehen. Seltsames Gefühl, das... In einer Straße unweit von hier finden Bauarbeiten statt (Vorbereitung für den Bau der EZB), da wird irgendein Schlauberger einen ganzen Kabelstrang »durchgebissen« haben...

                  Viele Grüße aus Frankfurt/Main,
                  Patrick

                  --

                     Diblom
                  _ - jenseits vom delirium - _
                  [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                  Nichts ist unmöglich? Doch!
                  Heute schon gegökt?
                  1. Ausserdem kann ich nach einer Woche ohne DSL mich seit heute endlich wieder ausführlich im Forum tummeln :-)

                    Hier waren wir letztens 2 Tage (fast) ohne alles: Kein Telefon (also kein DSL), kein Fernsehen. Seltsames Gefühl, das...

                    Ich hatte ja immerhin Modem. Das ist aber heutzutage fast nicht benutzbar und vor allem teuer wenn man eine DSL-Flat gewohnt war und sein Surfverhalten nicht anpaßt.
                    Aber letztlich war es ok, da ich die Woche mit renovieren, lesen und einem Wochenendurlaub verbracht hatte. Trotzdem hat es mich gefreut als das grüne Licht, das an der Fritzbox den Internetzugang signalisiert, gestern Abend wieder leuchtete :-)

                    Struppi.

          2. Hallo Sven!

            Ich habe das gefühl das mir das im moment noch zu hoch ist deshalb hab ich mal mit etwas ganz ganz simplen angefangen und zwar will ich eine datei ausgeben und zum beispiel nach jeder zehnten zeile ein hallo ausgeben aber das klappt nicht.

            for $datei (@dat)

            ^^^ Birnen

            for $zahl (1..50)

            ^^^ Äpfel

            Ebbelwoi kannst Du nur mit Äpfeln machen.
            Will sagen: Modulo-»Dividieren« kannst Du nur mit Zahlen. In Deinem ersten Beispiel ist $datei eine Zeile der geöffnet und im Array @dat gespeicherten Datei, aber keine Zahl.

            Die vordefinierte Variable $. liefert die Anzahl der Zeile einer geben eingelesenen Datei - also eine Zahl.

            Viele Grüße aus Frankfurt/Main,
            Patrick

            --

               Diblom
            _ - jenseits vom delirium - _
            [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
            Nichts ist unmöglich? Doch!
            Heute schon gegökt?