perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 21
Click for quality!




11.02.2012 / 20:02

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  CGI: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragRedirect für Downloadcounter
Seitenanfang
Ich habe mal eine Frage zur Umsetzung eines Downloadcounters.
Ich habe eine Seite erstellt (www.digioso.de/test2.pl), auf der verschiedene Dinge zum Download angeboten werden.
Klickt man auf einen der Buttons, wird die test1.pl aufgerufen.
Dort erhöht er in der Datenbank die Anzahl der Downloads für diesen Link und holt sich anschließend den dazugehörigen Download-Link aus der Datenbank.
Ich habe ein wenig gesucht und halt gesehen, dass es eine redirect() Funktion gibt, allerdings scheint diese nicht so ganz zu funktionieren.
Weiß jemand, woran es liegen kann?


#!/usr/bin/perl -w

use strict;
use CGI;
use CGI qw/:standard/;
use CGI::Carp qw(fatalsToBrowser);
use lib "./modules";
use Navi;
use DB;

my $cgi = new CGI();

Navi->print_navi(); # Print Navigation

foreach my $key ( $cgi->param() )
{
my $id = $cgi->param($key);
my $dbh = DB->connect_db();
my $sql = qq{update movie_projects set downloads = downloads + 1 where id=$id};
my $sth = $dbh->prepare( $sql );
$sth->execute();
$sql = qq(select link, downloads from movie_projects where id=$id);
$sth = $dbh->prepare( $sql );
$sth->execute();
while(my @ergebnis = $sth->fetchrow_array)
{
#print redirect("$ergebnis[0]");
print "Status: 302 Moved\nLocation: $ergebnis[0]\n\n";
print "<br>link $ergebnis[0] <br>dl $ergebnis[1]";
}
print "<br>$key = ".$cgi->param($key);
}

Navi->end_navi();
exit 0;

Datum: 06.05.2007-11:18

Beitragre: Redirect für Downloadcounter
Seitenanfang
Taucht eine Fehlermeldung auf?

Was ist das Ergebnis der Ausführung und wie sollte das gewünschte Ergebnis sein?

Datum: 06.05.2007-12:07

Beitragre: Redirect für Downloadcounter
Seitenanfang
Anstatt auf die Seite (zum Download) weitergeleitet zu werden, wird einfach nur eine Ausgabe im Browser gemacht:
Hier als Beispiel:

Status: 302 Moved Location: http://files.filefront.com/lotro_great_barrowswmv/;6736666;;/fileinfo.html 

Datum: 06.05.2007-12:30

Beitragre: Redirect für Downloadcounter
Seitenanfang
Die Status-Zeile ist Teil des HTTP-Headers, sollte also nicht in der Ausgabe des HTML-Dokuments (im Browser) erscheinen.
Wenn dem so ist, dann kannst du davon ausgehen, dass schon ein HTTP-Header (eine oder mehrere Header-Zeilen gefolgt von einer Leerzeile) ausgegeben wurde.

Ich gehe mal davon aus, dass dies in deinen Code beim Aufruf von 'print_navi' passiert.


Navi->print_navi(); # Print Navigation

Wenn in 'print_navi' der Header schon geschrieben wird - in etwa so


print $cgi->header();

dann ist ein Aufruf von

print $cgi->redirect($url);

wirkungslos da der Browser die Zeile "Status: 302 ..." nicht mehr als Header sondern als Body interpretiert.

-----8<-----
The redirect() function redirects the browser to a different URL. If you use redirection like this, you should not print out a header as well.
----->8-----

LOESUNG:
Gib den HTTP-Redirect-Header aus bevor 'print_navi' aufgerufen wird und gib den 'Content-Type' mit an


my $cgi = CGI->new();

print $cgi->redirect(-uri => $url,
-type => 'text/html',
-status => '302 Found');

Anmerkung:
Der Status 302 ist nicht 'Moved' sondern 'Found', 'Moved Permanently' ist 301.

-----8<-----
301 Moved Permanently
302 Found
303 See Other
304 Not Modified
305 Use Proxy
307 Temporary Redirect
----->8-----

Siehe RFC 2616, Abschnitt "6.1.1 Status Code and Reason Phrase" und die entsprechenden Erlaeuterungen der Codes im Abschnitt 10.

http://www.faqs.org/rfcs/rfc2616.html

Datum: 07.05.2007-12:58

Beitragre: Redirect für Downloadcounter
Seitenanfang
Ah, vielen Dank.

So klappt es jetzt:


#!/usr/bin/perl -w

use strict;
use CGI qw/:standard/;
use CGI::Carp qw(fatalsToBrowser);
use lib "./modules";
use DB;

my $url;
my $cgi = CGI->new();

foreach my $key ( $cgi->param() )
{
my $id = $cgi->param($key);
my $dbh = DB->connect_db();
my $sql = qq{update movie_projects set downloads = downloads + 1 where id=$id};
my $sth = $dbh->prepare( $sql );
$sth->execute();
$sql = qq(select link, downloads from movie_projects where id=$id);
$sth = $dbh->prepare( $sql );
$sth->execute();
while(my @ergebnis = $sth->fetchrow_array)
{
$url = $ergebnis[0];
}
}

print redirect($url);

exit 0;

Datum: 07.05.2007-19:17

-






-
-