Ankündigung

Einklappen
Keine Ankündigung bisher.

Rangliste Tippspiel

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Rangliste Tippspiel

    Hallo zusammen,

    bin neu hier, seid gnädig.

    Ich bin in den vergangenen Wochen neu ins Thema php und SQL eingestiegen, da ich meine EM-/WM-Tippspiele etwas interaktiver gestalten wollte. Bisher musste ich alle Tippabgaben händisch in Excel übertragen...

    Habe soweit alles Nötige hinbekommen - Tippabgabe wird in Datenbank geschrieben, ich kann auch schon die Punkte der Teilnehmer berechnen und in die Datenbank zurückschreiben lassen. Nun scheitere ich (trotz einiger Stunden mit Tante Google und diversen "Programmierversuchen") aber an den Dingen, die "nice to have" sind.

    Ich würde gerne noch die Platzierung der Teilnehmer ermitteln, um daraus immer online den aktuellen Zwischenstand ausgeben zu können.

    In der Datenbank-Tabelle em21_punkte gibt es für jeden Eintrag (also für jeden Teilnehmer) neben ID, name und punkte auch einen Feld platz, welches man dafür nutzen könnte. Wie gesagt, id, name und punkte sind bereits mit Werten befüllt, nun fehlt eigentlich nur noch der platz.

    Um den Platz nicht manuell eingeben zu müssen habe ich mir gedacht, dass ich per php name und punkte aus der Tabelle auslese und dann irgendwie den Platz ermittle, um diesen für jeden namen wieder in die Datenbank-Tabelle zurückzuschreiben.

    Habe schon von Arrays und Sortiermöglichkeiten gelesen, beides bisher aber nicht genutzt (gebraucht). Mögliche Lösungen, die ich ergoogelt habe konnte ich irgendwie nicht auf meinen Fall umschreiben, zumindest hat bisher nichts funktioniert.

    Irgendjemand eine Idee? Am besten möglichst verständlich für einen Neueinsteiger.

    Grüße Marcus


    em21_punkte.png


  • #2
    Du brauchst platz nicht, denn das lässt sich aus Punkte ermitteln mit "SELECT... ORDER BY punkte". sollte ich komplett falsch liegen, dann habe ich das missverstanden und du du musst die Sortierkriterien noch mal definieren. Wenn das niccht reicht weil doppelte Punktzahl dann schau dir mal rank an.

    Kommentar


    • #3
      Um den Rang zu bestimmen, gibt es rank() und dense_rank(), siehe hier: https://www.postgresql.org/docs/13/f...ns-window.html Damit ist die Speicherung von Platz in der DB absolut obsolet, weil unsinnig.
      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

      Kommentar


      • #4
        Irgendwie so wahrscheinlich (ungetestet):

        PHP-Code:

        $sql 
        "SELECT
            id,
            name,
            punkte
        FROM
            em21_punkte
        ORDER BY
            punkte DESC"
        ;
        $sth $dbh->prepare($sql);
        $sth->execute();
        $result $sth->fetchAll();
        $platz 1;
        $platzSkip 1;
        $punkteBefore = -1;
        foreach(
        $result as $row) {
            
        $punkte = (int)$row["punkte"];
            echo 
        "Platz ".$platz.": " .$punkte." (".$row["name"].")<br>".PHP_EOL;
            if(
        $punkte === $punkteBefore) {
                
        $platzSkip++;
            } else {
                
        $platz += $platzSkip;
                
        $punkteBefore $punkte;
                
        $platzSkip 1;
            }

        Tutorials zum Thema Technik:
        https://pilabor.com
        https://www.fynder.de

        Kommentar


        • #5
          Danke euch schonmal für die ersten Antworten, werde das in den nächsten Tagen dann mal testen.

          Mein Ansatz war, dass ich den Rang gerne als Eintrag in der SQL-Tabelle hätte, um hinterher dann auf einer oder auch verschiedenen php-Seite elegant darauf zugreifen zu können indem ich platz, name, punkte aus der SQL-Tabelle auslese.

          Das Lesen von und Zurückschreiben in Datenbanken bekomm ich hin, dann hören meine Kenntnisse aktuell aber auch schon fast auf...

          Kommentar


          • #6
            Wozu?
            Wenn sich der Rank doch ständig ändert und du den bequem ermitteln kannst ist das nur Mehraufwand, weil du so den Rank ja erst ermitteln musst, was dir die DB perfekt abnimmt.

            Kommentar


            • #7
              Zitat von Markymax Beitrag anzeigen
              Mein Ansatz war, dass ich den Rang gerne als Eintrag in der SQL-Tabelle hätte, um hinterher dann auf einer oder auch verschiedenen php-Seite elegant darauf zugreifen zu können indem ich platz, name, punkte aus der SQL-Tabelle auslese.
              Dann leg eine View in der Datenbank dafür an, die das gewünschte Ergebnis ausgibt.

              Kommentar


              • #8
                Zitat von Markymax Beitrag anzeigen
                Mein Ansatz war, dass ich den Rang gerne als Eintrag in der SQL-Tabelle hätte, ...
                ... und exakt das ist grundlegend falsch.
                PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                Kommentar


                • #9
                  Zitat von akretschmer Beitrag anzeigen

                  ... und exakt das ist grundlegend falsch.
                  Okay, hab's verstanden...

                  Kommentar


                  • #10
                    Zitat von akretschmer Beitrag anzeigen
                    Um den Rang zu bestimmen, gibt es rank() und dense_rank(), siehe hier: https://www.postgresql.org/docs/13/f...ns-window.html Damit ist die Speicherung von Platz in der DB absolut obsolet, weil unsinnig.
                    Warum versuchst du eigentlich die ganze Zeit Hunde an Katzenfutter zu gewöhnen?
                    Standards - Best Practices - AwesomePHP - Guideline für WebApps

                    Kommentar


                    • #11
                      Das geht durchaus
                      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                      Kommentar


                      • #12
                        So, habe es jetzt mal mit der Variante von Andreas versucht, da ich hier "nur" den Code in meine php-Datei kopieren musste (also erstmal der vermeintlich einfachste Weg).
                        Also erstmal der Verbindungsaufbau zur Datenbank und dann der Code von Andreas.

                        Wenn ich die php-Seite aufrufe kommt keine Fehlermeldung (das deute ich schonmal als gutes Zeichen), es wird jedoch kein Text ausgegeben. Die geladene Seite ist einfach leer. Wie gesagt, ich bin echt Anfänger...

                        Wenn ich den Code anschaue, dann verstehe ich das Folgende:

                        Zuerst wird aus der Datenbanktabelle gelesen (id, name, punkte) und nach punkte sortiert.
                        Dann folgenden drei Zeilen die ich nicht verstehe, aber ich vermute, die sind notwendig, um mit den gelesenen Daten arbeiten zu können.
                        Danach werden drei Variablen definiert.
                        Und schließlich werden die Zeilen der Tabelle durchlaufen und eigentlich müsste als Ergebnis des ganzen Text (Rangliste) ausgegeben werden. Das if... else... braucht es hier quasi nur, um bei mehrfach gleicher Punktzahl die gleichen Platzierung zuzuordnen.

                        Ist das korrekt, was ich da schreibe oder hab ich da schon einen Verständnisfehler drin?

                        Kommentar


                        • #13
                          Zitat von Andreas Beitrag anzeigen
                          Irgendwie so wahrscheinlich (ungetestet):

                          PHP-Code:

                          $sql 
                          "SELECT
                          id,
                          name,
                          punkte
                          FROM
                          em21_punkte
                          ORDER BY
                          punkte DESC"
                          ;
                          $sth $dbh->prepare($sql);
                          $sth->execute();
                          $result $sth->fetchAll();
                          $platz 1;
                          $platzSkip 1;
                          $punkteBefore = -1;
                          foreach(
                          $result as $row) {
                          $punkte = (int)$row["punkte"];
                          echo 
                          "Platz ".$platz.": " .$punkte." (".$row["name"].")<br>".PHP_EOL;
                          if(
                          $punkte === $punkteBefore) {
                          $platzSkip++;
                          } else {
                          $platz += $platzSkip;
                          $punkteBefore $punkte;
                          $platzSkip 1;
                          }

                          Ware ein fetchAll(PDO::FETCH_GROUP) mit der Punktzahl als Gruppenschlüssel nicht einfacher?
                          Standards - Best Practices - AwesomePHP - Guideline für WebApps

                          Kommentar


                          • #14
                            Markymax Du solltest dir gut überlegen, ob du Code einfach kopierst Mach vielleicht erstmal das Quakenet Tutorial (https://php-tut.awesumdude.tv/about.html)
                            Tutorials zum Thema Technik:
                            https://pilabor.com
                            https://www.fynder.de

                            Kommentar


                            • #15
                              Danke für den Tipp!

                              Ich habe es allerdings nicht ganz blind kopiert - ich habe schon auch versucht, das Ganze zu verstehen. Deshalb ja auch mein letzter Beitrag. in dem ich versucht habe das in meinen Worten wiederzugeben.

                              PHP habe ich mir mit dem Tutorial auf http://de.html.net/tutorials/php/ beigebracht. Es ist nicht so, dass ich mich nur in Foren durchfrage, um mir Lösungen präsentieren zu lassen. Tatsächlich habe ich mir bisher alles mit "try and error" erarbeitet.

                              Ich werde mir das genannte Tutorial dann mal ansehen - vermutlich dann aber nach der EM, wenn ich wieder ein bisschen mehr Zeit habe, um tiefer einzusteigen. Vielleicht bekomme ich das mit der automatischen Rangliste dann bei der kommenden WM hin.

                              Kommentar

                              Lädt...
                              X