Ranglisten mit Sql-Datenbank erstellen

  • Hallo,


    ich erstelle für meinen Verein die Website (naja steht schon ne zeit lang, will aber noch ein wenig umbauen) und wir haben Vereinsinterne Meisterschaften mit Rangliste.
    Jetzt ist es sehr viel Aufwand jedesmal auf den ganzen Seiten im Quellcode offline das ganze zu ändern, und wollte deshalb etwas erstellen, wie ein Formular das aus Name und den zwölf Monaten besteht. Dabei soll immer nur so viele felder da sein wie auch Monate da sind.
    Also:
    Monat November: 11 Felder


    und immer eines soll dazugefügt werden. ist das Jahr vorbei soll das Feld für Monat 1 erscheinen...


    Die erzielten Punkte will ich dann in die Felder mit einem +Zeichen versehen, und dies wird in eine Datenbank eingetragen...
    1. Wie muss ich die Datenbanktabellen dann konfigurieren
    2. Wie mach ich dann, dass das Ergebnis automatisch errechnet wird (inkl. in der Datenbank eingetragen wird)
    3. Wie muss ich das Formular zum Eintragen konfigurieren
    4. Wie mach ich die Ausgabe um nach der höchsten Punktezahl auszugeben


    Bitte Um Hilfe

  • http://www.dietotenkoepfe.de/vereinsr2.php das ist die aktuelle Rangliste...
    so sollte dann die Ausgabe erfolgen


    Momentan ist das wie folgt aufgebaut:

  • Naja, Du musst ja erstmal wissen, was Du haben/anzeigen lassen willst.
    So wie ich das jetzt verstehe willst Du im 1Monat (Januar) immer die für diesen Monat erziehlten Punkte des Spielers eintragen?


    also:

    Code
    1. Rang Name Punkte ges Punkte Jan Punkte Feb ...
    2. 1. Stoner Sascha 38 11 4


    Mal von der Ausgabe abgesehen brauchst Du sicherlich (im Bezug auf die Tabelle und Möglichkeiten hier: http://www.dietotenkoepfe.de/vereinsr2.php)
    eine Tabelle für die Mitglieder

    Code
    1. id | vorname | nachname | aktiv
    2. -----------------------------
    3. 1 | hans | soundso | 1


    eine Tabelle für die Bewertungen/Ränge:


    eine Tabelle für die Punkte

    Code
    1. id | bezeichnung | punkte
    2. -----------------------------------------------
    3. 1 | bester Spieler des Abends | 10 Punkte
    4. 2 | zweit bester Spieler des Abends | 8 Punkte
    5. 3 | dritt bester Spieler des Abends | 6 Punkte
    6. 4 | viert bester Spieler des Abends | 4 Punkte
    7. 5 | fünft bester Spieler des Abends | 2 Punkte


    und eine Tabelle in der Du die punkte mitzählst:


    EDIT:
    hier mal die sql statements als bsp:

  • Brauchst eine Tabelle in der es Die monate als spalten gibt und die namen als datensätze mit der jeweiligen punkte anzahl.

    Code
    1. --------+----+----+----+----+-----+----+
    2. | 01 | 02 | 03 | 04 |[...]| 12 |
    3. --------+----+----+----+----+-----+----+
    4. Dieter | 05 | 30 | 02 | 08 |[...]| 09 |
    5. --------+----+----+----+----+-----+----+
    6. Hans | 06 | 00 | 09 | 03 |[...]| 01 |
    7. --------+----+----+----+----+-----+----+
    8. Peter | 25 | 10 | 15 | 08 |[...]| 09 |
    9. --------+----+----+----+----+-----+----+
  • Also wenn ich mir das so recht überlege, kann ich das einfach so machen, dass ich ein Formular mit jedem Namen unserer aktiven Mitglieder erstelle, wo ich die erzielten Punkte eintrage. Aber wie mache ich das in der Datenbank dann, das die gesamten spalten für die Gesamtpunktzahl zusammengezählt wird? die ausgabe müsste ich quasi dann mit

    SQL
    1. $SQL = mysql_query("SELECT * FROM *** ORDER BY gesamt");


    gehen oder? Also wenn ich eine Spalte mit "gesamt" in der DB mache..


  • Du musst Dir schon die Mühe machen und die Antworten lesen.
    Auch wenn sie etwas länger sind - was daraus resultiert, dass man die Antwort nicht in 2 Sätze fassen kann =)


    EDIT: das ist sogar schon getestet :)

  • jetzt muss ich das blos noch versuchen mit einem Formular zu verbinden, welche dann vom aktuellen Monat die Punkte einträgt... jemand ne Idee?


    Ausserdem müsste eig der Name rein, statt eine mitgl_id...


    das nächste, der Rang (Platzierung) fehlt ebenfalls... muss ich das dann in meiner Datei so sortieren lassen? nach dem Platz und vergeben? Oder wie kann ich ds machen?

  • hab das mal etwas abgeändert...


    CREATE TABLE IF NOT EXISTS `punkte` (
    `id` int NOT NULL AUTO_INCREMENT,
    `name` varchar(30) NOT NULL,
    `jahr` year(4) NOT NULL,
    `monat` enum('1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12') NOT NULL,
    `punkte` int NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `UNIQUE_name_mon_jah` (`name` , `monat` , `jahr`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;



    ist das ok?

  • Nun hab ich das so gemacht:


    ich habe meinen localhost (Xampp = neues Spielzeug :D) als Server...


    <?php


    // Wenn Formular abgeschickt
    if(isset($_POST["senden"])) {


    $server = "localhost";
    $benutzer = "root";
    $database = "rangliste";


    // Zugangsdaten zum Verbinden mit dem MySQL-Server
    $dbconnection = mysql_connect($server, $benutzer/*, $passwort*/) or die ("Fehler mysql_connect: ".mysql_error());
    // Auswahl der zu verwendenden Datenbank auf dem Server
    mysql_select_db($database) or die ("Fehler bei select_db: ".mysql_error());


    // Deklaration
    $name = $_POST["name"];
    $punkte = $_POST["punkte"];


    // Validierung
    if(!empty($punkte) && !empty($name)){


    // Daten in Datenbank eintragen
    $SQL = mysql_query("INSERT INTO punkte (name, punkte) VALUES ('$name', '$punkte')");


    if($SQL) {
    echo "Punkte erfolgreich eingetragen";
    }
    else {
    echo "Es konnte leider keine Verbindung zur Datenbank hergestellt werden";
    }
    }
    /*else {
    echo "Bitte füllen Sie alle Felder aus";
    }*/
    }



    ?>
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
    <table id="rangliste" border="1">
    <tr>
    <td class="name">Name</td>
    <td class="points">Punkte</td>
    </tr>
    <tr>
    <td class="name"><input type="text" class="fieldpunkte" name="name" value="Stoner Joachim" /></td>
    <td class="points"><input type="number_format" name="punkte" class="field"/></td>
    </tr>
    <tr>
    <td class="name"><input type="text" class="fieldpunkte" name="name" value="Stoner Nicole" /></td>
    <td class="points"><input type="number_format" name="punkte" class="field"/></td>
    </tr>
    <tr>
    <td class="name"><input type="text" class="fieldpunkte" name="name" value="Stoner Florian" /></td>
    <td class="points"><input type="number_format" name="punkte" class="field"/></td>
    </tr>
    <tr>
    <td class="name"><input type="text" class="fieldpunkte" name="name" value="Stoner Sascha" /></td>
    <td class="points"><input type="number_format" name="punkte" class="field"/></td>
    </tr>
    <tr>
    <td class="name"><input type="text" class="fieldpunkte" name="name" value="Mayr Heiko" /></td>
    <td class="points"><input type="number_format" name="punkte" class="field"/></td>
    </tr>
    <tr>
    <td class="name"><input type="text" class="fieldpunkte" name="name" value="Doll Iris" /></td>
    <td class="points"><input type="number_format" name="punkte" class="field"/></td>
    </tr>
    <tr>
    <td class="name"><input type="text" class="fieldpunkte" name="name" value="Schmidt Sandra" /></td>
    <td class="points"><input type="number_format" name="punkte" class="field"/></td>
    </tr>
    <tr>
    <td class="name"><input type="text" class="fieldpunkte" name="name" value="Heib Klaus" /></td>
    <td class="points"><input type="number_format" name="punkte" class="field"/></td>
    </tr>
    <tr>
    <td class="name"><input type="text" class="fieldpunkte" name="name" value="Kloth Britta" /></td>
    <td class="points"><input type="number_format" name="punkte" class="field"/></td>
    </tr>
    <tr>
    <td class="name"><input type="text" class="fieldpunkte" name="name" value="Aull Sabrina" /></td>
    <td class="points"><input type="number_format" name="punkte" class="field"/></td>
    </tr>
    <tr>
    <td class="points"><input type="reset" value="Zurücksetzen" id="zuruecksetzen" name="reset"/></td>
    <td class="name"><input type="submit" name="senden" id="login" value="Eintragen"/></td>
    </tr>
    </table>
    </form>
    </p>



    und aus dem vorigen Post geht heraus wie ich die database konfiguriert habe...



    es funktioniert nicht wie ganz gewollt...


    wer findet einen Fehler? Kann mir jemand helfen?

  • Hi Floh,


    für die Erstellung einer intelligenten MySQL Datenbank würde ich noch mehr Informationen benötigen, denn danach entscheide ich, wie ich die Tabellen aufbaue. 1. Schritt für mich wäre, Mitglieder und Punktesystem in 2 Tabellen, z.b. database 'rangliste'
    table 'mitglieder' (id,vorname,nachname) und table 'punkteliste' (id,mitglieds_id,punkte,datum,Nudelpudel,Nullinger des Abends, ...usw.).


    Wie muß ich mir die Punktevergabe vorstellen? Ihr trefft Euch jeden Freitag zum Kegeln. Spieler A kommt jeden Freitag und erzielt 4x5 Punkte, Spieler B war nur 3x da und hat jeweils 10 Punkte erzielt, Spieler C hat 4x8 Punkte erzielt.


    Wenn Du für jeden Spieler am entsprechenden Abend einen db Eintrag mit den erreichten Punkten machst, kannst Du hinterher mit den "super" Filterfunktionen die MySQL bietet, Rankings für alle möglichen Zeiträume erstellen. Wochenbester = Spieler B,
    Monatsbester Spieler C, Jahresbester ... usw. Einzeleinträge hätten auch den Vorteil, daß Du prüfen kannst wer und wann welche Punkte bekommen hat, falls es mal Rückfragen gibt.
    Bei der Eingabe würdest Du auch nicht alle Namen und Eingabeformulare in einer html Datei runterschreiben müßen, sondern ziehst Dir die Namen mit einer while Schleife aus der mitglieder Tabelle und läßt sie per table
    auflisten und setzt jeweils ein Punkte Eingabefeld dahinter. Durch die while schleife steht Dir bei jeder erzeugten Zeile automatisch die id zur Verfügung, die Du dann für den Eintrag in die 'punkteliste' verwendest.


    soweit ersma... 8o


    Gruß Ralph

  • Ja, geht. Nennt sich "ON DUPLICATE KEY UPDATE".
    Bsp:

    SQL
    1. INSERT INTO
    2. `tbl_name`
    3. SET
    4. `col_name` = 'abc',
    5. `col_name_2` = 'x'
    6. ON DUPLICATE KEY UPDATE -- wenn ein einzigartiger (unique) schlüssel schon existiert, dann update
    7. `col_name_2` = 'x'


    EDIT:
    Dabei ist aber zu beachten, dass eine evtl `id` AUTO_INCREMENT "trotzdem" hochgezählt wird.
    Heißt:
    angenommen
    `id`(PRIMARY KEY , AUTO_INCREMENT) ist momentan bei 1
    und du schickst diese Query ab:

    SQL
    1. INSERT INTO
    2. `tbl_name`
    3. SET
    4. `id` = '1',
    5. `col_name` = 'value'
    6. ON DUPLICATE KEY UPDATE
    7. `col_name` = 'value'


    dann wird beim nächsten INSERT (einem wirklich neuem Datensatz) die `id` 3 sein.
    Denn mysql Server behandelt dieses Statement wie 2 Anfragen:
    ein INSERT und ein UPDATE.


    Dabei geht er in etwa so vor:
    - starte INSERT auf `id` 1
    - zähle AUTO_INCREMENT +n (normalerweise +1)
    - INSERT auf `id` 1 schlug fehl - Schlüssel existiert bereits
    - UPDATE auf `id` 1


    der "interne" AUTO_INCREMENT (-Wert) für den nächsten einzufügenden Datensatz ist also schon um 1 erhöht,
    auch wenn er bei der letzten Anweisung nicht genutzt wurde.


    Zu dem Thema findet man einiges im Netz - Stichworte "mysql id gaps on duplicate key update"