highscore mit php/mysql



  • 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



  • kleine Verbesserungen:

    <?php
    require_once('config.php');                   
    $abfrage = 'SELECT username,level,score AS highscore FROM login ORDER BY score DESC';
    $result = mysql_query($abfrage);
    $rank = 1;
    
    echo <<<EOT1
    <table border="2" style="margin:0 auto">
      <thead>
        <tr>
          <th>Rang</th>
          <th>Username</th>
          <th>Score</th>
          <th>Level</th>
        </tr>
      </thead>
      <tbody>
    EOT1;
    
    while ($ar=mysql_fetch_array($result,MYSQL_ASSOC)){
      echo <<<EOT2
      <tr>
        <td>$rank</td>
        <td>{$ar['username']}</td>
        <td>{$ar['highscore']}</td>
        <td>{$ar['level']}</td>
      </tr>
    EOT2;
    
      $rank++;
    }
    
    echo '</tbody></table>';
    ?>
    

    aber nur als Tipp. Deins funktioniert genauso. Nur die <p>-Tags innerhalb einer Tabellenzelle sind sinnlos und das <center> sollte aus Prinzip vermieden werden.

    Die heredocs dienen der Übersichtlichkeit. Sowohl im Code als auch in der daraus resultierenden Ausgabe.

    Strings, die nicht geparst werden sollen (wie dein SQL-String) würde ich in einfache Hochkommas setzen. Dann ignoriert sie der Parser und die Ausführungsgeschwindigkeit dürfte vor allem bei langen Skripten ein wenig steigen. Hier ist es egal



  • hallo,

    die <p> Tags brauch ich allerdings da ich das so in der css festgelegt habe.
    ich habe ein schwarzen hintergrund und würde ich die <p> tags nicht nehmen würde die Schriftfarbe Schwarz sein, aber ich denke ich lasse es so da ich zur Zeit
    sehr zufrieden bin mit dem Ergebnis.

    trotzdem danke!

    mfg



  • Hallo,

    du kannst in CSS auch Klassen vergeben und somit jede einzelne TD anders formatieren.

    <td class='td1'>&nbsp;</td>
    <td class='td2'>&nbsp;</td>
    
    <style>
    .td1 {
     foo:bar;
    }
    .td2 {
     foo:anders_bar:
    }
    </style>
    

    VlG


Anmelden zum Antworten