kostenloser Webspace werbefrei: lima-city


Daten werden nicht in richtiger Reihenfolge ausgegeben

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    ultimate-bravery

    ultimate-bravery hat kostenlosen Webspace.

    Hallo,

    ich habe verschiedene Daten von einem Spiel in einer Datenbank stehen. Dazu gehört unter anderem ein Unix Timestamp der angibt, wann das Spiel gestartet wurde. Dann gibt es noch einen Wert in Sekunden wie lange das Spiel gedauert hat.

    Der Unix Timestamp steht unter dem Namen "createDate" in der DB und die Dauer des Spiels heißt "timePlayed". Der Unix Timestamp ist allerdings 13 Zeichen lang. Da der normale Unix Timestamp aber meines Wissens 10 Zeichen hat, schneide ich die letzten 3 Ziffern vom Timestamp ab.

    Ich möchte jetzt die Spiele ausgeben und zwar so, dass die Spiele, die zuletzt beendet wurden, ganz oben stehen. Das Ende des Spiels rechne ich also mit createDate+timePlayed aus. Dann möchte ich halt ausgeben vor wie vielen Minuten das Spiel beendet wurde. Also hier mal der Code:

    $query = "SELECT * FROM spiele ORDER BY (createDate+timePlayed) DESC;";
    $result = $mysqli->query($query);
    while ($zeile = $result->fetch_array()) {
    	$timePlayed = $zeile['timePlayed'];
    	$createDate = $zeile['createDate'];
    	$createDate = substr($createDate, 0, 10);
    	$differenz = time()-($createDate+$timePlayed);
    	echo sec2min($differenz).' minutes ago<br>';
    }


    Also die Spiele sollen sortiert nach dem Zeitpunkt des Spielendes ausgegeben werden. Die Funktion sec2min wandelt halt die Sekunden in Minuten um.

    Das Problem ist jetzt halt, dass die Spiele nicht in der richtigen Reihenfolge ausgegeben werden. So ist zum Beispiel gerade die Reihenfolge:

    25 minutes ago (createDate: 1409076048, timePlayed: 1713, createDate+timePlayed: 1409077761, Differenz zur aktuellen Zeit: 1539)
    23 minutes ago (createDate: 1409075982, timePlayed: 1883, createDate+timePlayed: 1409077865, Differenz zur aktuellen Zeit: 1435
    24 minutes ago (createDate: 1409075934, timePlayed: 1915, createDate+timePlayed: 1409077849, Differenz zur aktuellen Zeit: 1451
    35 minutes ago (createDate: 1409075421, timePlayed: 1765, createDate+timePlayed: 1409077186, Differenz zur aktuellen Zeit: 2114
    ...

    Was habe ich falsch gemacht? Wieso ist die Reihenfolge falsch?

    Ich würde mich über Hilfe freuen.
    Viele Grüße
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hallo ultimate-bravery,
    was das ; nach DESC soll weiß ich nicht, aber ansonsten kann ich keinen Fehler finden. Obwohl es kommisch ist das nur das erste Ergebnis falsch sotiert ist, das deutet darauf hin, dass doch ein Fehler vorhanden ist (vieleicht in dem fehlenden Code oder warscheinlicher in der DB)
    Bei dem Timestamp vermute ich, dass du einen Millitimestamp verwendest.
    Bei sowas kannst du auch immer mit einem anderen Programm die Sql Abfrage richtig stellen (normaler Timestamp) und warscheinlich tritt dann der Fehler auch auch. Dann weißt du das es an der DB liegt und nicht am Code oder andersrum.
    w3j
  4. hi,

    das Semicolon braucht man, um ein SQL-Statement abzuschließen... aber auch nur bei MsSQL, MySQL kommt ohne Semikolon aus...

    der Fehler liegt offensichtlich in
    ORDER BY (createDate+timePlayed)


    der sortiert das createDate absteigend... anscheinend versucht er timePlayed als 2. Sortierparameter zu nehmen bei gleichen createDate, oder er ignoriert den syntax-Fehler... auf jeden Fall da unten keine berechnungen

    ungeprüft würde ich dir folgenden Änderungsvorschlag empfehlen... musst du prüfen...

    SELECT createDate+timePlayed as endTime, *
    FROM spiele
    ORDER BY endTime DESC;
  5. Autor dieses Themas

    ultimate-bravery

    ultimate-bravery hat kostenlosen Webspace.

    sebulon schrieb:
    der Fehler liegt offensichtlich in
    ORDER BY (createDate+timePlayed)


    der sortiert das createDate absteigend... anscheinend versucht er timePlayed als 2. Sortierparameter zu nehmen bei gleichen createDate, oder er ignoriert den syntax-Fehler... auf jeden Fall da unten keine berechnungen

    ungeprüft würde ich dir folgenden Änderungsvorschlag empfehlen... musst du prüfen...

    SELECT createDate+timePlayed as endTime, *
    FROM spiele
    ORDER BY endTime DESC;


    Nachdem ich das getestet habe und es nicht funktioniert hat bin ich selber auf den Fehler gekommen. Wie w3j gesagt hat, steht in der Datenbank der Millitimestamp und auf diesen Millitimestamp rechne ich die Sekunden aus timePlayed drauf. Da ich Sekunden auf Millisekunden rechne entsteht ein Fehler. Wenn ich timePlayed mal 1000 rechne klappt es. Also so:

    ORDER BY (createDate+(timePlayed*1000)) DESC


    Danke an euch ;)
  6. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!