Hallo, ik zoek een countdownscript. Uit een sql-database wordt een $duur (bijv. 5 minuten) uitgelezen welke naar nul aftelt zodra op een button (start) geklikt wordt, waarbij een user middels een sessie is ingelogd (dit laatste is al klaar). Bij nul kan er middels een echo aangeven worden dat de tijd afgelopen is en/of er een verdere actie komt. Ik denk dat het script niet of deels javascript moet zijn, want bij het verversen van de pagina begint hiermee het script opnieuw of werkt niet goed. Na dagenlang zoeken naar countdownscript heb ik helaas nog geen gevonden die voldoet aan dat wat ik wil.

Wil/kan iemand helpen? Eventueel tegen een lichte vergoeding (als het script maar goed werkt!)

gr. Sunadumari
Hey,

Als je SQL queries kan dan kan je i.p.c. ook rekenen met mysql. Er zijn een aantal functies die je in de query kan zetten waarmee je met datums kan rekenen. Gelukkig zijn die perfect uitgelegt in de MySQL documentatie:

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

Wat je dan moet doen:
- Bekijk hoe lang nog afgeteld moet worden via mysql query (de tijd die het nu is - starttijd - duur).
- Javascript: als de tijd uit de bovenstaande query groter dan nul is: voer de functie countdown(var seconds) uit.
- Zet de starttijd in de database en begin met aftellen als iemand op de knop drukt:

<?php
echo "<input type='button' id='countdown' value='tel af' onclick='setStarttime(); countdown($seconds)'";
?>

- setStarttime moet via Ajax een php bestand aanroepen dat een query in MySQL uitvoert: UPDATE tabel SET starttime = NOW() WHERE gebruiker = $id o.i.d.
- Maak (of zoek) een functie countdown($seconds) in javascript dat elke seconde aftelt en bij 0 bijvoorbeeld een alert("Tijd voorbij") uitvoert.

Greetz,

Theforce117

[edit]Typo[/edit]
ik heb twee tabellen, user en avonturen.
Die gegevens kan ik zelf tevoorschijn toveren middels php.
Een gebruiker die middels een sessie is ingelogd kan kiezen voor een aantal avonturen. Als hij een avontuur kiest wordt middels now() de begintijd vastgelegd in de sql-database, tabel user. In het veld bezet in de tabel user wordt de waarde op 1 gezet zodat de user niet tegelijketijd iets anders kan doen (een ander avontuur bijv.).
De duur, die ik zelf bepaal, van elk avontuur is al vastgelegd in de tabel avonturen. De waarde van dat veld (duur), bijv. 5 minuten, zou dus simpelweg opgeteld moeten worden bij de begintijd. Dit resultaat wordt dan de eindtijd. Als de eindtijd minus begintijd NUL is is het avontuur afgelopen. Dan volgt middels echo of print een mededeling en het avontuur is beeindigd (waarde van veld bezet in user is dan weer 0).

Wat wel lukt:
de inlogsessie van de gebruiker.
het tevoorschijn toveren van de avonturen
bezet op 1 of 0 zetten ZIE CODE
de begintijd in de db schrijven ZIE CODE

Wat niet lukt:
de countdown (en refresh van pagina heeft hier geen invloed op)
de eindtijd in de db schrijven daar de eindtijd niet/niet juist berekend wordt ZIE CODE
de id van de betreffende avontuur in de db tabel user schrijven (thans waarde 1) ZIE CODE



CODE

if ($_POST['Submit']=='OKAY')
{
$query = mysql_query("update $users  SET bezet='1'   WHERE user_email = '$_SESSION[user]' ");
$query = mysql_query("update $users  SET avontuur='1' WHERE user_email = '$_SESSION[user]' ");
$query = mysql_query("update $users  SET avontuurbegin=now()   WHERE user_email = '$_SESSION[user]' ");
$query = mysql_query("update $users  SET avontuureinde=now()+$duration WHERE user_email = '$_SESSION[user]' ");
echo "<meta http-equiv='refresh' content='0;URL=avontuur.php'>"; 
exit();
    }


$duration is dan de duur van het avontuur, maar deze optelsom klopt niet...
Het is niet nodig om de eindtijd ook in de database op te slaan. Dat is immers al af te leiden uit de opgeslagen begintijd en de opgeslagen duur van een bepaald avontuur.

De manier die je nu gebruikt om e.e.a. op te slaan is niet geheel correct. Je gebruikt nu de users tabel om dingen als begintijd en huidig avontuur op te slaan, maar eigenlijk zou je daar een aparte tabel voor moeten gebruiken. Hoe wil je nu immers bijhouden welke avonturen een bepaalde gebruiker al voltooid heeft?

Neem bijvoorbeeld de volgende opzet:

users
-------
id INT
username VARCHAR
...

avonturen
-------------
id INT
avontuur VARCHAR
duur (in minuten) INT
...

users_avonturen
--------------------
id INT
user_id INT
avontuur_id INT
start DATETIME

Als een gebruiker nu een nieuw avontuur begint, maak je een nieuw record aan in de users_avonturen tabel waarin je naast het user_id en avontuur_id ook de starttijd (NOW()) opgeeft.

Bepalen van de eindtijd van het huidige avontuur van de betreffende gebruiker kan dan als volgt:

SELECT
  ua.start,
  ua.start + INTERVAL a.duur MINUTE AS eind
FROM
  users_avonturen AS ua
INNER JOIN
  avonturen AS a
    ON a.id = ua.avontuur_id
WHERE
  ua.user_id = 1
ORDER BY
  ua.start DESC
LIMIT 1

Deze query geeft je zowel de start als eindtijd van het huidige avontuur van de gebruiker met het id 1. Het belangrijkste van deze query is de berekening van de eindtijd:

ua.start + INTERVAL a.duur MINUTE AS eind

Oftewel de starttijd uit de users_avonturen tabel plus de duur in minuten uit de avonturen tabel.

Mogelijk dat dit je nu allemaal hocus pocus lijkt, maar dan raad ik je toch echt aan om eens wat handleidingen door te gaan lezen om te begrijpen wat hier nu gebeurt. Een paar suggesties:

SQL Beginnershandleiding
Datum- en tijdfuncties in MySQL

Succes!

Reageren