Ich habe mal wieder ein problem, ich habe eine Skript geschrieben der Lokal auf meinem Rechner wunderbar funktioniert, jedoch, wenn ich in auf den Server von meinem Webspacehoster lege, dann nicht mehr!
Woran kann es liegen?
Du solltest schrittweise vorgehen.
a.) ein skript was läuft erstellen
b.) nach und nach alle Module einbinden. nicht alle Provider (gerade kostenlose) stellen alle Module zu Verfügung.
Hier mal der Quellcode:
Der keinerlei Möglickeiten der Fehleranalyse bietet.
Es fängt an, hier:
#!/usr/bin/perl
Keine Warnungen
Stimmt der Pfad zum Perl.
#Daten für den Skript
Wo ist use strict?
$urlskript = "http://www.seb.esser.space4free.de/cgi-bin/event.test.pl";
$urlhost = "http://www.space4free.de";
$dblockip = '/srv/www/htdocs/web80/html/cgi-bin/lockip.db';
$dblockweb = '/srv/www/htdocs/web80/html/cgi-bin/lockweb.db';
$locktime = 21600; #Sekunden => 6 Stunden
my $urlskript = "http://www.seb.esser.space4free.de/cgi-bin/event.test.pl";
my $urlhost = "http://www.space4free.de";
my $dblockip = '/srv/www/htdocs/web80/html/cgi-bin/lockip.db';
my $dblockweb = '/srv/www/htdocs/web80/html/cgi-bin/lockweb.db';
my $locktime = 21600; #Sekunden => 6 Stunden
use CGI ("param");
Das ist eine absolute Verschwendung eines 200KB grossen Modules. Les dir mal durch was CGI.pm alles kann.
use DB_File;
das kann schon ein Knackpunkt sein, das muss nicht vorhanden sein, obwohl es bei jeder Perl Version dabei sein sollte.
use CGI::Carp qw/fatalsToBrowser/;
ist für die Entwicklung von CGI Perl Skripten (vor allem wenn man keinen Zugriff auf die Logfiles hat) notwendig.
$webaccount = param("webaccount");
$step = param("step");
$step = $step+1;
Das kann schon zu einem Fehler führen, wenn $step keine Zahl ist.
Ansonsten: $step++;
$url = "$urlskript"."?webaccount="."$webaccount"."&step="."$step";
my $url = "$urlskript?webaccount=$webaccount&step=$step";
$account = "web"."$webaccount";
my $account = "web$webaccount";
#Überprüfen, ob die IP noch gesperrt ist
%lockip;
tie(%lockip,'DB_File',$dblockip,O_RDWR|O_CREAT, 0777) or die "Can't tie %lockip with file $dblockip";$cip = $ENV{'REMOTE_ADDR'};
$ctime = time;
$timediff = $ctime - $lockip{$cip};
Weder $ENV{'REMOTE_ADDR'} noch $lockip{$cip} sind notwendigerweise definiert.
Du solltest bzw. du musst gerade bei CGI Programmen jeden wert prüfen, ob er das enthält was er enthalten darf.
if ($timediff > $locktime)
{
untie %lockip;
}
else
{
print "Content-type: text/html\n\n";
print "<html>\n";
print "<body>\n";
print "Leider kannst du nicht einen weiteren Klick speichern, da deine IP-Adresse vor weniger<br>\n";
print "als 6 Stunden schon einmal einen Klick gespeichert hat\n";
print "</body>\n";
print "</html>\n";
Wie schon gesagt CGI.pm bietet vielfältige Möglichkeiten.
Gerade um das Mischen von HTML Code und Perl Code zu vermeiden und was die Lesbarkeit des Codes aber auch die Fehleranfälligkeit des HTML Codes vermeidet.
print CGI::header(),
CGI::start_html(),
"Leider kannst du nicht einen weiteren Klick speichern, da deine IP-Adresse vor weniger<br>\n",
als 6 Stunden schon einmal einen Klick gespeichert hat\n",
CGI::end_html()
Auch ansonsten ist dein Code nicht sonderlich pflegeleicht und lesbar, du solltest die einzelnen Schritte in Funktionen packen und immer wiederkehrende Aufgaben ebenfalls.
Struppi.