TomC: Cookie wird nicht gesetzt

Hallo,

kann mir jemand einen Tip geben, wo in dem folgenden Script der Fehler ist, der verhindert, dass ein Cookie gesetzt wird?

Ich weiß, dass Cookies keine verlässliche Lösung sind.

Es grüßt und dankt TomC

START

#!/usr/bin/perl -w
###!C:/Programme/Apache Group/Apache2/Perl/bin/perl.exe -w

use strict;
use CGI;
my $cgi = new CGI;
use CGI::Carp qw(fatalsToBrowser);
use functions;

require "config_sag.pl";
my $path_all    = &changevar("path_all");
my $path_pages  = &changevar("path_pages");
my $path_cgi    = &changevar("path_cgi");
my $path_abs    = &changevar("path_abs");

entfaellt nach einbau des scripts -> page ist dort bekannt

my $page = "testseite";

my $cookie_sid;
my $cookie_time = time();
my $cookie_page = $page;
my $cookiestring;
my $cookie_new;

my $table_tracking = "$path_abs/cgi-bin/dynavi/table_tracking.pl";
my $dbstring;

my $html;

cookie in cookiestring einlesen

$cookiestring = $cgi->cookie(-name=>'Tracking');

wenn cookiestring leer ist, setze einen cookie

if($cookiestring eq ""){
   # sid generieren (vorerst strato-variable nutzen)
   $cookie_sid = $ENV{'UNIQUE_ID'};
   # sid und weitere daten in einem neuen cookie speichern
   # solange im cookie nur die sid steht, langt auch folgendes
   $cookiestring = $cookie_sid;
   $cookie_new   = $cgi->cookie(-name=>'Tracking',
                                -value=>$cookiestring);
   print $cgi->header(-cookie=>$cookie_new);
   # F sid, time und page in einer tabelle speichern
   &saveTracking();
   # F sid, time und page zur kontrolle in die seite schreiben
   $html .= "KEIN cookie<br>\n";
   &printTracking();
}

wenn cookiestring nicht leer ist, lies die sid aus

else{
   # der cookiestring muss noch in seine bestandteile zerlegt werden.
   # solange im cookie nur die sid steht, langt auch folgendes
   $cookie_sid = $cookiestring;

# F sid, time und page in einer tabelle speichern
   &saveTracking();
   # F sid, time und page zur kontrolle in die seite schreiben
   $html .= "cookie vorhanden<br>\n";
   &printTracking();
}

print $html;

sub saveTracking(){
   $dbstring = "$cookie_sid|$cookie_time|$cookie_page\n";

open(DATEI, ">>$table_tracking") || die "open track file [$table_tracking]: not found. $!";
      print DATEI $dbstring;
   close(DATEI) || die "close track file [$table_tracking]: not found. $!";
}

sub printTracking(){
   $html .= "$cookie_sid|$cookie_time|$cookie_page";
}

END
  1. Hmmm ... kann es damit zusammenhängen, dass es sich um ein SSI handelt und somit versucht wird, den header 2mal zu schreiben???

    TomC

    1. Moin Moin !

      Bindest Du die Ausgabe des CGIs mit SSI ein? Dann führt der Server "Selbstgespräche" und fragt sich selbst nach der Ausgabe des CGIs, ignoriert den Großteil der Header vom CGI (u.a. auch wohl die Cookies), und bindet das Ergebnis in die umgebende Seite ein.

      Alexander

      --
      Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
      1. Moin!

        Ja, das war dann letztendlich auch meine Vermutung.
        Das würde ja aber bedeuten, dass die Verwendung von Cookies bei Einsatz von SSI/Perl fast ausgeschlossen ist. Es sei denn, folgendes Vorgehen funktioniert: Setzen des Cookies mit Javascript und lesen per Perl. Sehr unbefriedigend.

        TomC

  2. my $path_all    = &changevar("path_all");
    my $path_pages  = &changevar("path_pages");
    my $path_cgi    = &changevar("path_cgi");
    my $path_abs    = &changevar("path_abs");

    Das '&' ist überflüssig und sollte auch vermieden werden, da es eine spezielle Bedeutung hat.

    $cookie_new   = $cgi->cookie(-name=>'Tracking',
                                    -value=>$cookiestring);
       print $cgi->header(-cookie=>$cookie_new);

    Wenn ich nichts übersehen habe, setzt du keine expire Time, kann es daran liegen?

    Struppi.

    1. Hi,

      Das '&' ist überflüssig und sollte auch vermieden werden, da es eine spezielle Bedeutung hat.

      Warum sollte es vermieden werden?
      Das soll keine rethorische, sondern eine ernsthafte Frage sein ;-).

      Andres Freund

      --
      ss:) zu:) ls:} fo:) de:] va:) ch:| n4:& rl:° br:^ js:( ie:% fl:( mo:|
      1. Hi,

        Das '&' ist überflüssig und sollte auch vermieden werden, da es eine spezielle Bedeutung hat.
        Warum sollte es vermieden werden?
        Das soll keine rethorische, sondern eine ernsthafte Frage sein ;-).

        Es ist Perl 4 syntax und wird heute nur noch benötigt, wenn man @_ automatisch an eine Funktion weitergeben will.

        Mehr wieß ich ich auch nicht, kann aber sein, dass in den Dokus mehr steht.

        Struppi.

        1. Moin Moin !

          A subroutine may be called using an explicit & prefix. The & is optional in modern Perl, as are parentheses if the subroutine has been predeclared. The & is not optional when just naming the subroutine, such as when it's used as an argument to defined() or undef(). Nor is it optional when you want to do an indirect subroutine call with a subroutine name or reference using the &$subref() or &{$subref}() constructs, although the $subref->() notation solves that problem. See the perlref manpage for more about all that.

          Not only does the & form make the argument list optional, it also disables any prototype checking on arguments you do provide. This is partly for historical reasons, and partly for having a convenient way to cheat if you know what you're doing. See Prototypes below.

          Beides aus perldoc perlsub.

          Alexander

          --
          Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
          Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"