countdown script
Wil/kan iemand helpen? Eventueel tegen een lichte vergoeding (als het script maar goed werkt!)
gr. Sunadumari
hier wat aan?
Heb je Ik neem aan dat je naast een 'duur' ook iets van een 'starttijd' in je database heb staan?
SanThe: bedankt, echter bij verversen van de pagina begint de countdown opnieuw... dat is niet de bedoeling.
Gewijzigd op 01/01/1970 01:00:00 door sunadumari
- Duur 10 minuten (database)
- Starttijd 13:15 (database)
- Huidige tijd 13:22
- Nog 3 minuten aftellen
sunadumari schreef op 12.04.2009 13:20:
SanThe: bedankt, echter bij verversen van de pagina begint de countdown opnieuw... dat is niet de bedoeling.
Niet als je het juiste aantal seconden, minuten en uren in het script stopt.
Gewijzigd op 01/01/1970 01:00:00 door Arjan Kapteijn
- Starttijd 13:15 (database)
- Huidige tijd 13:22
- Nog 3 minuten aftellen
en hoe kun je dit met php bewerkstelligen?
Ik weet inmiddels dat het Timestamp is, de begintijd heb ik reeds voor elkaar, echter de eindtijd nog niet. Ik moet dus in php aangeven: eindtijd = beginttijd + duur... daar worstel ik nu mee.
Gewijzigd op 01/01/1970 01:00:00 door sunadumari
SELECT TIMEDIFF( '2009-04-12 12:00:00', NOW())
Eventueel zou je met DATE_FORMAT de tijden 'los' kunnen ophalen voor het script van SanThe.
combinatie php en sql, er wordt dus wel opgeslagen in een database.
Maar reken dan ook met de database. Die is nu eenmaal veel beter in het rekenen met data en tijden dan dat PHP dat is.
ok, daar heb ik echter helaas nog niet zoveel kaas van gegeten.
Wat heb je nu in je DB staan en -hoe- haal je die gegevens op?
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:
Code (php)
1
2
3
2
3
<?php
echo "<input type='button' id='countdown' value='tel af' onclick='setStarttime(); countdown($seconds)'";
?>
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
Gewijzigd op 01/01/1970 01:00:00 door The Force
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
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
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();
}
{
$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...
Gewijzigd op 01/01/1970 01:00:00 door sunadumari
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
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
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:
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!