Chris: Rangliste mit cgi?

Ich versuche seit Tagen vergeblich eine Rangliste zu programmieren.
In der Rangliste sollen der Nickname, die Anzahl Punkte, Gewonnene und Verlorene Spiele aufgenommen werden.
Die Daten sollen über ein HTML Formular eingegeben werden.
Durch Passwortschutz sollen unberechtigte Postings verhindert werden.
Gewonnene Spiele sollen 3 Punkte bringen, verlorene -1 Punkt.

Kann mir jemand helfen solch ein Script zu proggen?

PS:

Das ist die sehr umfassende Version meines Versuchs:
Der Passwortschutz ist gewährleistet und die übergebenen Daten des Formulars werden in je einer Datei zu je einem Spieler gespeichert.
In einer anderen .pl Datei wird dann die Rangliste angezeigt - mit den entsprechenden Daten zu den einzelnen Spielern. Nur nicht in einer Rangfolge; und das ist das Problem. Helft mir bitte!

_____________________________________________________________________

#!C:/Perl/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Ergebnis posten</title>\n";
print "</head><body>\n";

SPIELER A __VOLTOBAL__

if (  $ENV{QUERY_STRING} eq "Spieler=Voltobal&Passwort=&Status=Gewonnen" )

{
 open(DATEI0, "<../USClan/Rangliste/PVoltobal.dat");
 my $AA = <DATEI0>;
 my $AAneu = $AA + 3;
 close(DATEI0);

open(DATEI0, ">../USClan/Rangliste/PVoltobal.dat");
 print DATEI0 $AAneu;
 close(DATEI0);

open(DATEI1, "<../USClan/Rangliste/GVoltobal.dat");
 my $AB = <DATEI1>;
 my $ABneu = $AB + 1;
 close(DATEI1);

open(DATEI1, ">../USClan/Rangliste/GVoltobal.dat");
 print DATEI1 $ABneu;
 close(DATEI1);

print '<html><head><title>Posting erfolgreich</title><link rel="stylesheet" type="text/css" href="../USClan/zentral.css"></head><body bgcolor="black" text="#808080">';
 print '<h2 align="center">Posting erfolgreich</h2>';
 print '<p align="center"><a href="./ranglist.pl"><u>Zurück</u></a></p>';
 print "</body></html>";
 }

elsif (  $ENV{QUERY_STRING} eq "Spieler=Voltobal&Passwort=&Status=Verloren" )

{
 open(DATEI0, "<../USClan/Rangliste/PVoltobal.dat");
 my $AA = <DATEI0>;
 my $AAneu = $AA - 1;
 close(DATEI0);

open(DATEI0, ">../USClan/Rangliste/PVoltobal.dat");
 print DATEI0 $AAneu;
 close(DATEI0);

open(DATEI2, "<../USClan/Rangliste/VVoltobal.dat");
 my $AC = <DATEI2>;
 my $ACneu = $AC + 1;
 close(DATEI2);

open(DATEI2, ">../USClan/Rangliste/VVoltobal.dat");
 print DATEI2 $ACneu;
 close(DATEI2);

print '<html><head><title>Posting erfolgreich</title><link rel="stylesheet" type="text/css" href="../USClan/zentral.css"></head><body bgcolor="black" text="#808080">';
 print '<h2 align="center">Posting erfolgreich</h2>';
 print '<p align="center"><a href="./ranglist.pl"><u>Zurück</u></a></p>';
 print "</body></html>";
 }

SPIELER B __ZORRO11__

elsif (  $ENV{QUERY_STRING} eq "Spieler=zorro11&Passwort=&Status=Gewonnen" )

{
 open(DATEI3, "<../USClan/Rangliste/Pzorro11.dat");
 my $BA = <DATEI3>;
 my $BAneu = $BA + 3;
 close(DATEI3);

open(DATEI3, ">../USClan/Rangliste/Pzorro11.dat");
 print DATEI3 $BAneu;
 close(DATEI3);

open(DATEI4, "<../USClan/Rangliste/Gzorro11.dat");
 my $BB = <DATEI4>;
 my $BBneu = $BB + 1;
 close(DATEI1);

open(DATEI4, ">../USClan/Rangliste/Gzorro11.dat");
 print DATEI4 $BBneu;
 close(DATEI4);

print '<html><head><title>Posting erfolgreich</title><link rel="stylesheet" type="text/css" href="../USClan/zentral.css"></head><body bgcolor="black" text="#808080">';
 print '<h2 align="center">Posting erfolgreich</h2>';
 print '<p align="center"><a href="./ranglist.pl"><u>Zurück</u></a></p>';
 print "</body></html>";
 }

elsif (  $ENV{QUERY_STRING} eq "Spieler=zorro11&Passwort=&Status=Verloren" )

{
 open(DATEI3, "<../USClan/Rangliste/Pzorro11.dat");
 my $BA = <DATEI3>;
 my $BAneu = $BA - 1;
 close(DATEI3);

open(DATEI3, ">../USClan/Rangliste/Pzorro11.dat");
 print DATEI3 $BAneu;
 close(DATEI3);

open(DATEI5, "<../USClan/Rangliste/Vzorro11.dat");
 my $BC = <DATEI5>;
 my $BCneu = $BC + 1;
 close(DATEI5);

open(DATEI5, ">../USClan/Rangliste/Vzorro11.dat");
 print DATEI5 $BCneu;
 close(DATEI5);

print '<html><head><title>Posting erfolgreich</title><link rel="stylesheet" type="text/css" href="../USClan/zentral.css"></head><body bgcolor="black" text="#808080">';
 print '<h2 align="center">Posting erfolgreich</h2>';
 print '<p align="center"><a href="./ranglist.pl"><u>Zurück</u></a></p>';
 print "</body></html>";
 }

SPIELER C __DEATHER3__

elsif (  $ENV{QUERY_STRING} eq "Spieler=Deather3&Passwort=&Status=Gewonnen" )

{
 open(DATEI6, "<../USClan/Rangliste/PDeather3.dat");
 my $CA = <DATEI6>;
 my $CAneu = $CA + 3;
 close(DATEI6);

open(DATEI6, ">../USClan/Rangliste/PDeather3.dat");
 print DATEI6 $CAneu;
 close(DATEI6);

open(DATEI7, "<../USClan/Rangliste/GDeather3.dat");
 my $CB = <DATEI7>;
 my $CBneu = $CB + 1;
 close(DATEI7);

open(DATEI7, ">../USClan/Rangliste/GDeather3.dat");
 print DATEI7 $CBneu;
 close(DATEI7);

print '<html><head><title>Posting erfolgreich</title><link rel="stylesheet" type="text/css" href="../USClan/zentral.css"></head><body bgcolor="black" text="#808080">';
 print '<h2 align="center">Posting erfolgreich</h2>';
 print '<p align="center"><a href="./ranglist.pl"><u>Zurück</u></a></p>';
 print "</body></html>";
 }

elsif (  $ENV{QUERY_STRING} eq "Spieler=Deather3&Passwort=&Status=Verloren" )

{
 open(DATEI6, "<../USClan/Rangliste/PDeather3.dat");
 my $CA = <DATEI6>;
 my $CAneu = $CA - 1;
 close(DATEI6);

open(DATEI6, ">../USClan/Rangliste/PDeather3.dat");
 print DATEI6 $CAneu;
 close(DATEI6);

open(DATEI8, "<../USClan/Rangliste/VDeather3.dat");
 my $CC = <DATEI8>;
 my $CCneu = $CC + 1;
 close(DATEI8);

open(DATEI8, ">../USClan/Rangliste/VDeather3.dat");
 print DATEI8 $CCneu;
 close(DATEI8);

print '<html><head><title>Posting erfolgreich</title><link rel="stylesheet" type="text/css" href="../USClan/zentral.css"></head><body bgcolor="black" text="#808080">';
 print '<h2 align="center">Posting erfolgreich</h2>';
 print '<p align="center"><a href="./ranglist.pl"><u>Zurück</u></a></p>';
 print "</body></html>";
 }

NOBODY __FEHLER__

else
 {
 print '<html><head><title>Posting fehlgeschlagen</title><link rel="stylesheet" type="text/css" href="../USClan/zentral.css"></head><body bgcolor="black" text="#808080">';
 print '<h2 align="center">Posting fehlgeschlagen</h2>';
 print '<p align="center">Überprüfe deine Angaben und versuche es noch einmal.</p>';
 print '<p align="center"><a href="../USClan/post.html"><u>Zurück</u></a></p>';
 print "</body></html>";
 }

  1. Auch Dir ein ganz besonders fröhliches Hallo,

    Kann mir jemand helfen solch ein Script zu proggen?

    nein, wir können Dir aber helfen, es zu programmieren. Dazu musst Du uns sagen, wo Du Probleme hast, warum diese Probleme auftreten, wie Du sie und mit jeweils welchem Ergebnis zu lösen versucht hast.

    Nur nicht in einer Rangfolge; und das ist das Problem.

    perldoc -f sort
    perldoc perlfaq4 "How do I sort an array by (anything)?"

    #!C:/Perl/bin/perl -w
    use strict;
    use CGI::Carp qw(fatalsToBrowser);

    Schön!

    print "Content-type: text/html\n\n";

    [...]

    if (  $ENV{QUERY_STRING} eq "Spieler=Voltobal&Passwort=&Status=Gewonnen" )

    Nicht schön bis grausam.

    perldoc CGI
    perldoc perlstyle

    open(DATEI0, "<../USClan/Rangliste/PVoltobal.dat");

    perldoc -f die

    Im CGI-Kontext ist das "aktuelle Verzeichnis", auf das Du Dich hier beziehst, übrigens undefiniert. Diese Datei kann überall gesucht werden.

    my $AA = <DATEI0>;

    perldoc perlstyle zur Benamsung von Variablen

    open(DATEI0, ">../USClan/Rangliste/PVoltobal.dat");

    Jiautsch. Was passiert, wenn zwei Anfragen fast gleichzeitig kommen? Es drohen Datenverluste.

    perldoc -f flock
    perldoc perlopentut

    open(DATEI0, "<../USClan/Rangliste/PVoltobal.dat");

    Schon wieder? Beschäftige Dich auch mit der Thematik Kapselung, und lies

    perldoc -f sub

    SPIELER B __ZORRO11__

    Was passiert eigentlich, wenn ein weiterer Spieler hinzukommt? Änderst Du dann das Script?

    Cheatah

    1. Oh weh...
      Auch wenn ich das Ganze mitlerweile doch zum laufen gebracht habe...

      MEIN SCRIPT SCHEINT JA TOTALER HORROR ZU SEIN...

      Wie gesagt funktioniert das Ganze Offline wunderbar. Ich kann die ganze Sache bisher nicht uploaden da ich noch kein cgi Verzeichnis habe.
      Das ist der Auszug aus der Ranglisten Datei. Hier werden die Daten sortiert und ausgegeben.
      _____________________________________________________________________

      #=======================================#

      __RANGLISTENPLATZ__

      #=======================================#
           #
      open (DATEN, "< daten.dat");  #
      my @links=<DATEN>;   #
      close (DATEN);    #
           #
      @sorted=();    #
      foreach $zeile(@links)   #
      {     #
      ($nick,$punkte,$gewonnen,$verloren)=split /|/,$zeile; #
      push(@sorted, [$nick,$punkte,$gewonnen,$verloren]); #
      }                     #
      @sorted=sort{$b->[1] <=> $a->[1]} @sorted;         #
           #
      #=======================================#

      #=======================================#

      __RANGFOLGE__

      #=======================================#
           #
      $rang=1;
      foreach (@sorted)
      {
      print <<"LISTE";
       <tr align="center">
       <td><p><b>$rang</b></p></td>
       <td><p>@{$_}[0]</p></td>
       <td><p>@{$_}[1]</p></td>
       <td><p>@{$_}[2]</p></td>
       <td><p>@{$_}[3]</p></td>
      LISTE

      $rang++;
      }
           #
      #=======================================#
      _____________________________________________________________________

      Ist das wenigsten zu gebrauchen?

      Die gesamten Pfadnamen müssen beim uploaden noch geändert werden und dann werden sie auch absulut angegeben.

      Ja, ich müsste das Script ändern wenn ein neuer Spieler hinzukommt.
      Es sollen sich nur Clanmitglieder daran beteiligen und es wird ja nicht alle Stunde ein neues Mitglied hinzukommen.

      1. Hi,

        MEIN SCRIPT SCHEINT JA TOTALER HORROR ZU SEIN...

        sagen wir, da fehlt noch einiges an Grundlagenwissen ;-)

        Wie gesagt funktioniert das Ganze Offline wunderbar.

        Unter Laborbedingungen, also z.B. wenn immer nur höchstens ein Zugriff zur Zeit stattfindet. Im Lifebetrieb ist die Frage nicht ob, sondern wann Du Datenverluste hast.

        #=======================================#

        __RANGLISTENPLATZ__

        Dein Editor ist nicht auf Festbreitenschrift eingestellt, oder Du verwendest Tabulatoren statt Leerzeichen. Beides ist suboptimal.

        open (DATEN, "< daten.dat");  #

        Du fängst noch immer nicht mögliche Fehler mit "or die" o.ä. ab. Warum schreibst Du eigentlich hinter jede Zeile eine Raute?

        @sorted=sort{$b->[1] <=> $a->[1]} @sorted;         #

        Jau! :-)

        $rang=1;

        Bist Du sicher, dass Du Dir warnings anzeigen lässt? Sprich: Wo hast Du die Variable deklariert?

        print <<"LISTE";

        Auch das solltest Du öfter machen.

        Ist das wenigsten zu gebrauchen?

        Ja, größtenteils :-)

        Die gesamten Pfadnamen müssen beim uploaden noch geändert werden und dann werden sie auch absulut angegeben.

        Relativ ist schon in Ordnung - wenn es relativ zu etwas absolutem ist. Nimm %ENV oder FindBin zu Hilfe.

        Ja, ich müsste das Script ändern wenn ein neuer Spieler hinzukommt.

        Dabei sind die Dateinamen sooo schön generisch... ;-)

        Es sollen sich nur Clanmitglieder daran beteiligen und es wird ja nicht alle Stunde ein neues Mitglied hinzukommen.

        Nein, aber es ist völlig unnötig, in einem solchen Fall Programmlogik anfassen zu müssen - im Zweifel gibt es nur einen Copy&Paste-Fehler oder sowas. Halte Dir lieber eine Liste registrierter User-Namen. Wenn Du die Seite(n) per Authentication (z.B. in .htaccess konfiguriert) schützt, hast Du in $ENV{'REMOTE_USER'} bereits alles, was Du brauchst.

        Cheatah

        1. Hi,

          auch Hi,

          Dein Editor ist nicht auf Festbreitenschrift eingestellt, oder Du verwendest Tabulatoren statt Leerzeichen. Beides ist suboptimal.

          Du fängst noch immer nicht mögliche Fehler mit "or die" o.ä. ab. Warum schreibst Du eigentlich hinter jede Zeile eine Raute?

          Das ist einfach nur grafische Gestaltung die im editor besser aussieht. OK - das mit "die" sollt ich dann mal machen.

          @sorted=sort{$b->[1] <=> $a->[1]} @sorted;
          $rang=1;

          Bist Du sicher, dass Du Dir warnings anzeigen lässt? Sprich: Wo hast Du die Variable deklariert?

          Das meiste aus diesem script hab ich aus einem downloadzählerscript rausgezogen (DAS ist kompliziert...), welches ich mir runtergeladen habe. Daher mein plötzlicher Fortschritt. Das Problem dabei: Das ganze funktioniert nur wenn im Kopf die Zeile "use strict;" weggelassen wird... ;daher gibt es keine fehlermeldung.

          Dabei sind die Dateinamen sooo schön generisch... ;-)

          Und was würdest du da vorschlagen? Ein Anmeldesript das durch passwort geschütz ist?

          Nein, aber es ist völlig unnötig, in einem solchen Fall Programmlogik anfassen zu müssen - im Zweifel gibt es nur einen Copy&Paste-Fehler oder sowas. Halte Dir lieber eine Liste registrierter User-Namen. Wenn Du die Seite(n) per Authentication (z.B. in .htaccess konfiguriert) schützt, hast Du in $ENV{'REMOTE_USER'} bereits alles, was Du brauchst.

          .htaccess ist bei t-offline leider nicht verfügbar...