highscore mit php/mysql



  • Hallo liebe Forengemeinde,

    Ich brauche mal wieder ein wenig Hilfe.
    Und zwar ich wollte ein kleines Highscore schreiben die Punkte stehen in einer Tabelle mit den anderen Daten.

    jetzt möchte ich das die Daten (username und score) aus der Datenbank ausgelesen werden und dann sortiert in die Website aufgelistet werde zu erst nur die ersten 3 und dann eine ganze Rangliste

    Ich hoffe das ihr mich da ein wenig unterstützen könnt

    danke



  • Um etwas mit PHP und MySQL zu machen, sollte man am besten PHP und MySQL können.



  • hallo,

    ja das ist verständlich allerdings kann es immer mal vorkommen das man etwas nicht weiss oder man einfach nicht weiterkommt

    mfg



  • derdefeckter schrieb:

    ja das ist verständlich allerdings kann es immer mal vorkommen das man etwas nicht weiss oder man einfach nicht weiterkommt

    Und wo kommst du nicht weiter?



  • hallo,

    bei allen ich kann ohne probleme eine registrirung schreiben aber mit dem highscore da komm ich gar nicht weiter ich dachte mir das zunächst so

    <?php
    require ('config.php');
    error_reporting(E_ALL); 
    
    $abfrage = "SELECT username,score FROM login ORDER BY score LIMIT 0,10";
    $end = mysql_query($abfrage);
    
    echo mysql_result( $end, 0, 0);
    ?>
    

    dann mit einem array sortieren allerdings gibt er mir da schon die falschen texte aus



  • so nochmals hallo,

    ich bin etwas weiter gekommen:

    <?php
    require ('config.php');
    error_reporting(E_ALL); 
    
    $abfrage = "SELECT username,score AS highscore FROM login ORDER BY username,score LIMIT 0,10";
    $end = mysql_query($abfrage);
    
    while( $row = mysql_fetch_assoc( $end ))
    {
         echo $row['highscore']."<br />";
    }     
    ?>
    

    die ausgabe ist

    0
    0
    0
    0
    

    allerdings kein username

    hoffentlich kann mir da jemand helfen

    danke



  • Also um das sortieren brauchst du dich zunächst mal garnicht kümmern.
    Dafür sorgt das ORDER BY in deiner SQL-Abfrage schon.

    Zur Ausgabe:
    Wenn du den Usernamen ausgeben willst, dann musst du den Usernamen ausgeben 😃
    Klingt komisch, ist aber so:

    echo $row['username']."<br />";
    echo $row['highscore']."<br />";
    


  • hallo BasicMan01,

    vielen dank erstmal

    dann noch eine frage brauche ich AS oder kann ich das weglassen?
    wofür steht das AS genau was macht es mit dem AS habe ich mich noch gar nicht beschäftigt und finde dazu auch keine plausible und verständliche erklärung

    danke



  • hinter dem AS gibst du einen Alias an.
    Nehmen wir an, du hast lange Spaltennamen wie "ich_bin_ein_langer_spaltenname", dann
    kann man mit so einem Alias die Schreibarbeit verringern in dem man dann mit einem kurzen Bezeichner weiterarbeitet.

    Außerdem "verbirgst" du den Ursprungsnamen nach außen, was in Hinblick auf Security an vielen Stellen auch zu empfehlen ist. (sei es, weil man aufgrund von Sortierung die Spaltenbezeichnungen im Javascript verwendet).

    Des weiteren kann es vorkommen, dass sich mal ein Spaltennamen ändert, dann muss man diese Änderung nur in der Query vornehmen und der Rest des Codes bleibt verschont. (wenn der Alias weiterhin auf den Inhalt der Spalte hinweißt).

    😃 Ist also wie dein Nickname hier im Forum, damit niemand weiß, wie du wirklich heißt



  • ja jetzt klappt es alles soweit

    nur habe ich jetzt noch ein problem
    er listet den mit den meisten punkten von unten an und denn mit den wenigsten punkten nach oben aber eigentlich bräuchte ich das andersrum wäre das auch so einfach möglich?

    mfg

    EDIT: Danke das war mal eine sehr plausible und auch verständliche erklärung 👍



  • SELECT username,score FROM login ORDER BY score DESC LIMIT 0,10

    kommt von descent => Abstieg



  • gut

    vielen dank an alle die mitgeholfen haben!

    zur letzten frage wie kriege ich vor jeder ausgabe jetzt den rangplatz bei 1 angefangen?
    sonst hätte ich alles

    mfg



  • derdefeckter schrieb:

    gut

    vielen dank an alle die mitgeholfen haben!

    zur letzten frage wie kriege ich vor jeder ausgabe jetzt den rangplatz bei 1 angefangen?
    sonst hätte ich alles

    mfg

    Speicherst du den Rangplatz auch in der Datenbank? Nein? Dann machst du das in PHP:

    $rank = 1;
    
    while (...)
    {
     echo "Rang " . $rank . "...";
    
     $rank++;
    }
    

    Du musst also nur die Variable $rank einbauen, denke ich.
    Solltest du natürlich so sortieren, dass die niedrigste Highscore oben steht, musst du eben runter zählen. Dazu die Anzahl der Einträge in der Datenbank als Startwert nutzen.

    Eventuell lässt sich der Rangplatz auch in der Abfrage direkt berechnen. Aber wie das geht, weiß ich nicht.



  • so danke an alle!
    habe es jetzt fertig!

    wer es sehen will wie ich es gelöst habe ich poste den code hier mal

    $abfrage = "SELECT username,score AS highscore FROM login ORDER BY score DESC LIMIT 0,10";
    $result  =  mysql_query($abfrage);
    $num=1;
    $rank = 1;
    
     while ($ar=mysql_fetch_array($result,MYSQL_ASSOC)){
    
    echo "<p>"."Rang ".$rank." " .$ar['username'].": ".$ar['highscore']."</p>";
    
    $rank++; 
    }
    


  • Und du denkst natürlich an SQL Injections, richtig?
    Lass mich raten: Du weißt nicht, was das ist 🤡

    Ist das eine Spielerei oder soll das wirklich online geschaltet werden?
    Falls ja, schlag das Wort lieber nach. Falls nein, tu es trotzdem in einer Minute voller Langeweile. Sinnvoll investierte Zeit 😉



  • hallo,

    SQLINJEKTION

    brauch ich doch da eigentlich nicht da keine eingabe über ein formular etc gemacht wird oder?

    also ich habe die sqlinjektion beim registrirungs formular und beim login mehr brauchte ich bisher nicht nachher noch beim profil ändern

    bei verbesserungen lasse ich mich gerne eines besseren belehren



  • Und du prüfst auch die Benutzernamen auf zulässige Zeichen (Stichwort XSS)?
    Dann ist ja gut.



  • ja

    zeichen wie !"§$%&/()=?`´+*#'<>|~\}][{²³
    kommen bei mir nicht rein
    habe ich extra so gemacht
    sicherheit steht bei mir an erster stelle

    mfg

    Edit: habe nochmal nach geguckt also der grossteil der Zeichen sind unzulässig!
    Und ich habe jetzt das Highscore System komplett fertig!
    sogar in einer tabelle!



  • Ein kleiner Tipp: Eine Whitelist ist sicherer als eine Blacklist.

    Das heißt: Leg nicht fest, was man NICHT darf, sondern leg fest was man DARF.

    Im Falle von Namen vielleicht: a-Z, 0-9, _, -, ...

    Denn du weißt nicht, welche Zeichen man dir noch ins System "schmuggelt".

    Wichtig ist auch, dass du deine Benutzer darauf hinweist, dass nur diese Zeichen erlaubt sind. Ansonsten ist das sehr frustrierend.

    Wofür ist eigentlich die Variable $num im oben geposteten Code? Sie wird in dem Codeausschnitt gar nicht verwendet. 😉 Auch die Einrückung und die Freiräume sind nicht so schön.

    So wäre es schon schöner. Es ist sicher Geschmackssache, aber unterschiedliche Anzahl von Leerzeichen, Einrückungen, etc. ist für die Lesbarkeit nicht förderlich.

    Wenn du schreibst:

    $x = 0;
    

    dann schreib nicht 3 Zeilen weiter:

    $y=  1;
    

    und danach:

    $z=1;
    

    So ists doch schon wesentlich lesbarer, oder?

    $abfrage = "SELECT username,score AS highscore FROM login ORDER BY score DESC LIMIT 0,10";
    
    $result = mysql_query($abfrage);
    $rank = 1;
    $num = 1; // Wozu?
    
    while ($ar = mysql_fetch_array($result, MYSQL_ASSOC)) {
        echo "<p>" . "Rang " . $rank . " " . $ar['username'] . ": " . $ar['highscore'] . "</p>";
    
        $rank++;
    }
    


  • hallo vielen dank!

    ja die variable num ist da wohl irgendwie rein geraten 🤡

    ich werde die gleich raus nehmen da sie nutzlos ist

    und ja es stimmt ich hatte den code nur in meiner test datei um es von dort zutesten da ich nichts veröffentlichen möchte das nicht sauber funktioniert

    mfg

    EDIT:

    <?php
    require ('config.php');					
    $abfrage = "SELECT username,level,score AS highscore FROM login ORDER BY score DESC ";
    $result  =  mysql_query($abfrage);
    $rank = 1;
    
    echo "<center><table Border=\"2\">
     <tr>
     <td><p>Rang</p></td>
     <td><p>Username</p></td>
     <td><p>Score</p></td>
     <td><p>Level</p></td>
     </tr>"; 
    
     while ($ar=mysql_fetch_array($result,MYSQL_ASSOC)){
    
    echo "<tr>"."<td><p>".$rank."</p></td><td><p>".$ar['username']."</p></td><td><p>".$ar['highscore']."</p></td><td><p>".$ar['level']."</p></td></tr>";
    $rank++; 
    }
    echo "</table></center>";
    ?>
    

    so sieht es in meiner online datei aus


Log in to reply