Alain: print ....wird trotz "exit" ausgeführt?!...apache BUG?

Hallo,
ich dachte immer wenn exit ausgeführt wird dann geht in perl nix mehr?
Dem ist aber nicht so,wie ich gemerkt habe-warum?
Ich habe ein gästebuch,welches emails in einer log abspeichert,
wenn der eintrag gefunden wird,wird exit ausgeführt.
Hier das beispiel:
sub check_log {
$logfile = "/home/guestbook/contlog.txt";
open(LOG,"+<$logfile") || &dead;
flock(LOG,LOCK_EX);
while (<LOG>){
&dead if /$FORM{'username'}/;
}
seek (LOG, 0, 2);
print LOG "$FORM{'username'}\n";
close (LOG) || &dead;
}

sub dead {
print "Content-type: text/html\n\n";
print "<center>Error: hello,you have already an entry in our guestbook\n";
print "<hr width='100%'></center>\n";
exit;
}

dead wird zwar ausgeführt und kein eintrag ins gästebuch gemacht,wenn
das suchwort z.B. hotmail.net findet im log.
Wenn jemand aber meinemail@hotmail.net eingibt,wird das (meinemail@hotmail.net) in die log eingetragen,jedoch nicht im gästebuch.
Beim zweiten versuch wird,aber dieselbige email nicht mehr in die log eingetragen.Frage,wieso wird die ganze email nochmal eingetragen in die log,wenn da der eintrag hotmail.net bereits drinnsteht und offensichtlich exit ausgeführt wird?
Grüsse
Alain

  1. Hallo Alain.

    ich dachte immer wenn exit ausgeführt wird dann geht in perl nix mehr?

    Ja, das ist auch so.

    Ich habe ein gästebuch,welches emails in einer log abspeichert, wenn der eintrag gefunden wird,wird exit ausgeführt.
    Hier das beispiel:
    sub check_log {
    $logfile = "/home/guestbook/contlog.txt";
    open(LOG,"+<$logfile") || &dead;

    Wenn die Datei nicht geöffnet werden kann, hat das eine andere Ursache als die, welche du durch die sub dead ausgeben lässt. Besser wäre es, eine aussagekräftige Fehlermeldung mitzugeben, in diesem Fall $!.

    while (<LOG>){
    &dead if /$FORM{'username'}/;
    }

    Ich persönlich bin weder ein Freund dieser q'n'd-Schreibweise noch der Verwendung eines RegEx, wo keiner nötig ist. Ein simpler Stringvergleich reicht hier völlig aus, zumal hier auch dein Problem liegen könnte (dein Regex matcht bei "hotmail.net" mangels Begrenzer auf jede E-Mail "...@hotmail.net", unbeschadet dessen, was vor dem "@" steht):

    while(<LOG>) {
      chomp($_);
      if ($_ eq $FORM{'username'}) {
        dead("$FORM{'username'} already exists.");
      }
    }

    sub dead {
    print "Content-type: text/html\n\n";
    print "<center>Error: hello,you have already an entry in our guestbook\n";

    hier dann besser
    print "<center>Error: $_[0]\n";

    Vielleicht hilft's ja.

    Freundschaft!
    Siechfred

    --
    Hinweis an alle Karnevalsmuffel: Aschermittwoch ist alles vorbei.
    1. Hallo Siechfred.

      ich dachte immer wenn exit ausgeführt wird dann geht in perl nix mehr?

      Ja, das ist auch so.

      Ich habe ein gästebuch,welches emails in einer log abspeichert, wenn der eintrag gefunden wird,wird exit ausgeführt.
      Hier das beispiel:
      while (<LOG>){
      &dead if /$FORM{'username'}/;
      }

      Ich persönlich bin weder ein Freund dieser q'n'd-Schreibweise noch der Verwendung eines RegEx, wo keiner nötig ist. Ein simpler Stringvergleich reicht hier völlig aus, zumal hier auch dein Problem liegen könnte (dein Regex matcht bei "hotmail.net" mangels Begrenzer auf jede E-Mail "...@hotmail.net", unbeschadet dessen, was vor dem "@" steht):

      und wie erklärst Du Dir das,dass der eintrag ins gästebuch nicht erfolgt ,wenn &dead ausgeführt wird,jedoch aber trotzdem in die LOG,obwohl "hotmail.net"(was sowiso ne ungültige email ist) bereits in der LOG steht?
      Grüsse
      Alain

      1. Hallo Alain.

        und wie erklärst Du Dir das,dass der eintrag ins gästebuch nicht erfolgt ,wenn &dead ausgeführt wird,jedoch aber trotzdem in die LOG,obwohl "hotmail.net"(was sowiso ne ungültige email ist) bereits in der LOG steht?

        Also in deinem Code habe ich nirgendwo einen Eintrag in ein Gästebuch feststellen können, nur in eine Logfile. Ich mach mal ein Beispiel:

        my $logfile = "/home/guestbook/contlog.txt";
        my $retcode = check_log();
        if($retcode == 1) {
          dead("Ein-/Ausgabefehler beim Öffnen der Logdatei.");
          exit(1);
        }
        else if($retcode == 2) {
          dead("User existiert bereits");
          exit(1);
        }
        else {
          # Eintrag ins Gästebuch
        }

        Fehlercodes:

        0: alles in Ordnung

        1: Fehler beim Öffnen

        2: User existiert

        sub check_log {
          open(LOG,"+<$logfile") || return 1;
          flock(LOG,LOCK_EX);
          while (<LOG>){
            chomp($_);
            if($_ eq $FORM{'username'}) {
              flock(LOG,LOCK_UN);
              close(LOG);
              return 2;
            }
          }
          seek (LOG, 0, 2);
          print LOG "$FORM{'username'}\n";
          flock(LOG,LOCK_UN);
          close (LOG);
          return 0;
        }

        So sollte es vom Prinzip her funktionieren. Btw, warst du nicht der Frager zum Thema Tainted-Modus und exit aus Subs heraus?

        Freundschaft!
        Siechfred

        --
        Hinweis an alle Karnevalsmuffel: Aschermittwoch ist alles vorbei.
        1. Hallo Siechfeld,

          und wie erklärst Du Dir das,dass der eintrag ins gästebuch nicht erfolgt ,wenn &dead ausgeführt wird,jedoch aber trotzdem in die LOG,obwohl "hotmail.net"(was sowiso ne ungültige email ist) bereits in der LOG steht?

          Also in deinem Code habe ich nirgendwo einen Eintrag in ein Gästebuch feststellen können, nur in eine Logfile. Ich mach mal ein Beispiel:

          my $logfile = "/home/guestbook/contlog.txt";
          my $retcode = check_log();
          if($retcode == 1) {
            dead("Ein-/Ausgabefehler beim Öffnen der Logdatei.");
            exit(1);
          }
          else if($retcode == 2) {
            dead("User existiert bereits");
            exit(1);
          }
          else {
            # Eintrag ins Gästebuch
          }

          das klingt vernüftig und logisch-geht vermutlich auch.Ich habe da aber leider keine grosse testmöglichkeit bei dem server.
          Ich würde das ganze am liebsten mit use strict benutzen,aber naja...
          Bei dem alten script das ich habe war das so,dass diese
          subs am anfang vom script direkt ausgeführt werden,bevor das gästebuch öffnet also:
          #!/usr/bin/perl
          $guestbookreal = "/home/guestbook/guestbook.html";
          $nochpaarvariablen

          &check_log;
          &general;
          &agentcheck;

          Begin the Editing of the Guestbook File

          open (FILE,"$guestbookreal") || die "Cannot Open guestbook\n";
          @LINES=<FILE>;
          close(FILE)........usw.

          So sollte es vom Prinzip her funktionieren. Btw, warst du nicht der Frager zum Thema Tainted-Modus und exit aus Subs heraus?

          möglich,das(Tainted-Modus) war auch mal eines meiner frage-themen zu perl :)
          warum?warst das Du damals,der geholfen hat? ich glaube es ging um "eine variable von der einen sub in die andere sub übertragen"-> mit shift...
          Grüsse
          Alain

          1. Hallo Alain.

            Ich würde das ganze am liebsten mit use strict benutzen,aber naja...

            Ein unsauberes und veraltetes Script umzubauen, dürfte dir mehr Arbeit machen, als ein neues zu schreiben :)

            Btw, warst du nicht der Frager zum Thema Tainted-Modus und exit aus Subs heraus?
            möglich,das(Tainted-Modus) war auch mal eines meiner frage-themen zu perl :)
            warum?warst das Du damals,der geholfen hat? ich glaube es ging um "eine variable von der einen sub in die andere sub übertragen"-> mit shift...

            Ich weiß nicht mehr so genau (naja, das Alter ...), ich glaube zum Tainted-Modus und zu return hatte ich mal was geschrieben.

            Freundschaft!
            Siechfred

            --
            Hinweis an alle Karnevalsmuffel: Aschermittwoch ist alles vorbei.
  2. Hier das beispiel:
    sub check_log {
    $logfile = "/home/guestbook/contlog.txt";
    open(LOG,"+<$logfile") || &dead;
    flock(LOG,LOCK_EX);
    while (<LOG>){
    &dead if /$FORM{'username'}/;
    }
    seek (LOG, 0, 2);
    print LOG "$FORM{'username'}\n";
    close (LOG) || &dead;
    }

    sub dead {
    print "Content-type: text/html\n\n";
    print "<center>Error: hello,you have already an entry in our guestbook\n";
    print "<hr width='100%'></center>\n";
    exit;
    }

    Wo hast du das denn her?

    kein strict, kein CGI.pm, veraltete Schreibweise für Funktionsaufrufe und darüber hinaus wird hier die Datei zum lesen und schreiben geöffnet, dabei würde ein schreibendes öffnen und anhängen reichen (open LOG, ">$logfile")

    Naja, und das deine Fehlerausgabe nicht unbedingt stimmt hat dir ja schon Siechfred erklärt.

    Struppi.

    1. Hi Struppi,

      Hier das beispiel:
      sub check_log {
      $logfile = "/home/guestbook/contlog.txt";
      open(LOG,"+<$logfile") || &dead;
      flock(LOG,LOCK_EX);
      while (<LOG>){
      &dead if /$FORM{'username'}/;
      }
      seek (LOG, 0, 2);
      print LOG "$FORM{'username'}\n";
      close (LOG) || &dead;
      }

      sub dead {
      print "Content-type: text/html\n\n";
      print "<center>Error: hello,you have already an entry in our guestbook\n";
      print "<hr width='100%'></center>\n";
      exit;
      }

      Wo hast du das denn her?

      Ich weiss ,sehr alt sogar,ein Matthew M. Wright script,welches ich kurz um ein paar details erweitert habe,z.B. verhinderung doppel(oder ungültige)einträge im gästebuch.Use strict..war mir zu aufwendig,da es nicht mein webserver ist,wo ich sowieso kein errorlog einsehen kann.

      kein strict, kein CGI.pm, veraltete Schreibweise für Funktionsaufrufe und darüber hinaus wird hier die Datei zum lesen und schreiben geöffnet, dabei würde ein schreibendes öffnen und anhängen reichen (open LOG, ">$logfile")

      wieso das?Ich muss doch erst nach einem eintrag suchen in der LOG,bevor in die LOG geschrieben wird.

      Naja, und das deine Fehlerausgabe nicht unbedingt stimmt hat dir ja schon Siechfred erklärt.

      Die fehler ausgabe sollte gleichzeitig das script beenden,mit einer mitteilung an den benutzer.
      Gruss
      Alain

      1. kein strict, kein CGI.pm, veraltete Schreibweise für Funktionsaufrufe und darüber hinaus wird hier die Datei zum lesen und schreiben geöffnet, dabei würde ein schreibendes öffnen und anhängen reichen (open LOG, ">$logfile")

        wieso das?Ich muss doch erst nach einem eintrag suchen in der LOG,bevor in die LOG geschrieben wird.

        onpropertychange

        Naja, und das deine Fehlerausgabe nicht unbedingt stimmt hat dir ja schon Siechfred erklärt.

        Die fehler ausgabe sollte gleichzeitig das script beenden,mit einer mitteilung an den benutzer.

        Du rufst aber dead an mehreren Stellen auf und gibst immer die gleiche Meldung aus.

        Struppi.

        1. wieso das?Ich muss doch erst nach einem eintrag suchen in der LOG,bevor in die LOG geschrieben wird.

          onpropertychange

          LOL, da war was anderes in der Zwischenablage, es sollte:

          stimmt, hab ich übersehen

          heißen.

          Struppi.