Cookie wird nicht gesetzt
TomC
- perl
0 TomC0 Alexander Foken0 TomC
0 Struppi
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
#!/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");
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;
$cookiestring = $cgi->cookie(-name=>'Tracking');
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();
}
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";
}
Hmmm ... kann es damit zusammenhängen, dass es sich um ein SSI handelt und somit versucht wird, den header 2mal zu schreiben???
TomC
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
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
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.
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
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.
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