highscore mit php/mysql
-
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ärungdanke
-
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 allesmfg
-
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 allesmfg
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 istIst 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 stellemfg
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'> </td> <td class='td2'> </td> <style> .td1 { foo:bar; } .td2 { foo:anders_bar: } </style>
VlG