Countdownabwandlung

  • PHP

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Countdownabwandlung

    moin leute,

    ich hab mit paar Leuten ne kleine Wette laufen, wofür ich einen Countdown bräuchte.
    Dieser soll mit einer Zahl z.B 100 beginnen und dann jeden Tag (nach 24h) 5 abziehen.
    Tag 1: 100
    Tag 2: 95
    Tag 3: 90...

    Dazu soll es dann eine Stoppfunktion geben (à la "ich packs nicht mehr"), wo man den Namen angibt und dann der Countdown gestoppt (Meldung: "XY hat den Countdown bei Wert 95 gestoppt") wird.

    Anschließend sollte man dann als Wettrichter (z.B über Phpmyadmin in der DB, table coundown disable=0) den Countdown weiterlaufen lassen können.

    PHP 4/5 + MySQL steht zur Verfügung.

    Kann mir da jemand helfen, wie man das ungefähr realisieren kann?

    Danke, greetz pbd
  • Moin,
    also am einfachsten, du nimmst als Startwert den time()-Stamp von 0:00:00 Uhr des Starttages. Um diesen Wert zu bekommen, benutz einfach mal diese Funktion:

    PHP-Quellcode

    1. function formdate($time=0) {
    2. if(!$time) $time = time();
    3. return mktime(0,0,0,date("n",$time),date("j",$time),date("Y",$time));
    4. }

    Der Rest ist ja einfache Mathematik.

    Da ja Tage vergehen können, wenn gestoppt wurde, muss man das natürlich berücksichtigen.

    Beispiel, wie die Ausgabe aussehen könnte:

    Quellcode

    1. function formdate($time=0) {
    2. if(!$time) $time = time();
    3. return mktime(0,0,0,date('n',$time),date('j',$time),date('Y',$time));
    4. }
    5. $qry = mysql_query('SELECT `disable`,`name`,`last_stop`,`uncount` FROM `countdown`') OR die('MySQL-Error: '.mysql_error());
    6. $row = mysql_fetch_assoc($qry);
    7. $startzeit = mktime(0,0,0,4,13,2008); //STUNDE | MINUTE | SEKUNDE | MONAT | TAG | JAHR
    8. $startwert = 100;
    9. $zaelwert = 5;
    10. $gestoppte_Tage = $row['uncount'];
    11. if($row['disable']) $gestoppte_Tage+= (formdate()-formdate($row['last_stop']))/86400;
    12. $tage = ((formdate()-$startzeit)/86400)-$gestoppte_Tage;
    13. $ausgabe = $startwert-($tage*$zaehlwert);
    14. if($row['disable']) {
    15. die($row['name'].' hat den Countdown bei Wert '.$ausgabe.' gestoppt.');
    16. }
    17. echo 'Tag'.$tage.': '.$ausgabe;
    Alles anzeigen


    Und die Stoppfunktion sollte auch nicht die Schwierigkeit darstellen.
    Ein <input type="text" name="name"...> sollte reichen.

    Die MySQL-Eintrag sollte dann so ähnlich aussehen:

    Quellcode

    1. mysql_unbuffered_query('UPDATE `countdown` SET `last_stop` = UNIX_TIMESTAMP(), `name` = \''.addslashes(htmlspecialchars($_POST['name'])).'\', `disable` = 1') OR die('MySQL-Error: '.mysql_error());

    Parrallel dazu ist disable 0 zu setzen, nur dass man Name und last_stop nicht aktualisieren braucht.
    Dafür muss man die gestoppten Tage ausrechnen und eintragen:

    Quellcode

    1. $verstrichene_tage = (formdate() - formdate($row['last_stop']))/86400;
    2. mysql_unbuffered_query('UPDATE `countdown` SET `disable` = 0, `uncount` = `uncount` + '.$verstrichene_tage) OR die('MySQL-Error: '.mysql_error());

    (Wie man an last_stop kommt sollte dir ja klar sein)

    Zum Schluss noch die Struktur der Tabelle countdown

    Quellcode

    1. CREATE TABLE `countdown` (
    2. `name` VARCHAR( 250 ) NOT NULL ,
    3. `disable` TINYINT( 1 ) UNSIGNED NOT NULL ,
    4. `last_stop` INT( 10 ) UNSIGNED NOT NULL ,
    5. `uncount` SMALLINT UNSIGNED NOT NULL
    6. )

    Natürlich darfst du nicht vergessen als erstes eine Reihe einzufügen:

    SQL-Abfrage

    1. INSERT INTO `countdown` (`name` ,`disable` ,`last_stop` ,`uncount` )
    2. VALUES ('', '0', UNIX_TIMESTAMP( ) , '0');


    Hoffe dir einen Pfad gezeigt zu haben
    Gruß
    Broken Sword
  • hi broken sword,

    danke für die schnelle und gute Antwort.
    Ich hoffe, ich nerve nicht, wenn ich noch etwas nachbore.
    Ich bin php leider nicht besonders erfahren.

    Die MySQL-Table + Query ist kein Problem.

    Eine generelle Frage hab ich noch:
    Ich habe jetzt zwei Dateien angelegt, einmal die Counterfunktion.php mit Ausgabe + Stopp form action=stoppfkt.php method=post, zum anderen die stoppfkt.php, mit der entsprechenden query. Richtig?

    Allerdings habe ich noch ein paar Probleme mit Time-Stamp.
    Meine Überlegungen:

    Mit dieser Funktion generiere ich den Startwert und trage ihn die Tabelle ein. Richtig?

    Um die vergangenen Tage auszurechnen wird dann der Startwert mit dem Istwert verglichen und daraus die Tage errechnet. Richtig?

    Wie wird $gestoppte_Tage errechnet bzw. wie kommt die Zahl 86400 zu Stand? (Da steh ich grad total aufm Schlauch)

    Gruß pbd
  • Hi,
    kein Problem. Nachfragen sind immer willkommen ;)

    zu 1) [Dateien] Richtig
    zu 2) [Funktion] Mit der Funktion generiest du den TimeStamp des übergebenen Tasges von 0Uhr 0 und 0 Sekunden. (damit man schneller Tage ausrechnen kann)
    zu 3) [Start/ist] Richtig
    zu 4) [$gestoppte_tage/86400] Da time() und mktime() mit Sekunden arbeiten muss man daraus erstmal die Tage errechnen. Da ein Tag 86400 Sekunden hat (60*60*24) brauch man einfach durch 86400 zu rechnen.
    $gestoppte_tage wir errechnet indem man beim Reaktivieren des Zählers einfach die Differenz von last_stop und jetzt nimmt, wieder die Tage ausrechnet und das ganze in die DB einträgt. Somit hat man immer einen Wert, den man von der allgemeinen Rechnung abziehen kann.
    Damit "die($row['name'].' hat den Countdown bei Wert '.$ausgabe.' gestoppt.');" den richtigen Ausgabe-wert enthält, wird wenn der Zähler deaktiviert ist die verstrichene Zeit, die er deaktviert ist, in Tagen genommen und zu $gestoppte_Tag dazu addiert.

    Hoffe das bringt etwas Klarheit. (wobei ich weiß, dass ich nicht der beste Erklärer bin)
    Gruß
    Broken Sword
  • also ich finde, dass dus wirklich gut erklärt hast.
    Trotzdem hab ich noch ne Frage ;)

    Angenommen es wird gestoppt, reaktiviert, nach ein paar Tagen wieder gestoppt und wieder reaktiviert. Werden dann beide Stopps miteinbezogen oder nur der letzte Stopp herausgerechnet?

    Edit: Ansonsten funktioniert alles 1a, ich hatte die Variable mit nem Blank versemmelt..

    danke, gruß pbd