Timestamp opslaan in database
Hallo,
ik wil een teller die bijvoorbeeld 10 u aftelt. Zodat je na die 10u toegang hebt tot een functie. Alleen moet de gebruiker van mij niet heel de tijd online zijn. Hoe doe ik dat?
Mvg
ik wil een teller die bijvoorbeeld 10 u aftelt. Zodat je na die 10u toegang hebt tot een functie. Alleen moet de gebruiker van mij niet heel de tijd online zijn. Hoe doe ik dat?
Mvg
Gewijzigd op 17/05/2015 19:50:17 door John De Zon
Op zich niet zo heel moeilijk. Je moet alleen van het idee teller af. Wat je namelijk doet is een timestamp opslaan in de database die een bepaald aantal minuten/uren/dagen later is dan nu. Vervolgens kijk je enkel in de database of het nu later is dan de tijd die in de database staat.
check of de tijd al gepasseerd is:
Toevoeging op 17/05/2015 13:43:19:
Of laat zien wat het verschil in uren en minuten is:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$date = new DateTime();
$date->add(new DateInterval('PT10H')); // zie http://php.net/manual/en/dateinterval.construct.php
$query = "UPDATE tablename SET datum='".$date->format('Y-m-d H:i:s')."'";
?>
$date = new DateTime();
$date->add(new DateInterval('PT10H')); // zie http://php.net/manual/en/dateinterval.construct.php
$query = "UPDATE tablename SET datum='".$date->format('Y-m-d H:i:s')."'";
?>
check of de tijd al gepasseerd is:
Code (php)
Toevoeging op 17/05/2015 13:43:19:
Of laat zien wat het verschil in uren en minuten is:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$query = "SELECT datum FROM tablename WHERE id=".$userId." AND datum > NOW()";
$result = mysqli_query($conn, $query);
if(mysqli_num_rows($result))
{
$row = mysqli_fetch_row($result);
$date = new DateTime($row['datum']);
$now = new DateTime();
$interval = $date->diff($now);
echo $interval->format('%R%h:%i'); // zie http://php.net/manual/en/dateinterval.format.php
} else {
echo 'De wachttijd is verstreken';
}
?>
$query = "SELECT datum FROM tablename WHERE id=".$userId." AND datum > NOW()";
$result = mysqli_query($conn, $query);
if(mysqli_num_rows($result))
{
$row = mysqli_fetch_row($result);
$date = new DateTime($row['datum']);
$now = new DateTime();
$interval = $date->diff($now);
echo $interval->format('%R%h:%i'); // zie http://php.net/manual/en/dateinterval.format.php
} else {
echo 'De wachttijd is verstreken';
}
?>
Gewijzigd op 17/05/2015 13:45:17 door Frank Nietbelangrijk
Kan ik dit script ook in PHP 5.3 gebruiken met MySQL?
>= 5.3.0 lees ik op php.net...
Met mysql... wat bedoel je hiermee?
Met mysql... wat bedoel je hiermee?
Gewijzigd op 17/05/2015 15:51:43 door Frank Nietbelangrijk
Met de oude MySQL extensie. Ik gebruik deze nog op die website.
Dat is geen probleem.
Hoe moet ik het aanpakken als de user bv. op de knop start de tijd drukt?
Omdat mijn eerste stukje code dan van toepassing is moet er iets in de database gezet worden. Dat kan enkel vanuit PHP. De knop is in de html pagina in de browser van de client.
Je hebt dan twee mogelijkheden:
- Het html formulier waarbij de hele pagina tevens refreshed wordt
- of een AJAX call
Toevoeging op 17/05/2015 17:07:24:
Voorbeeldje van de eerste:
Je hebt dan twee mogelijkheden:
- Het html formulier waarbij de hele pagina tevens refreshed wordt
- of een AJAX call
Toevoeging op 17/05/2015 17:07:24:
Voorbeeldje van de eerste:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
$date = new DateTime();
$date->add(new DateInterval('PT10H')); // zie http://php.net/manual/en/dateinterval.construct.php
$query = "UPDATE tablename SET datum='".$date->format('Y-m-d H:i:s')."'";
mysql_query($query);
}
?>
<form action="" method="post">
<button type="submit">Klik</button>
</form>
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
$date = new DateTime();
$date->add(new DateInterval('PT10H')); // zie http://php.net/manual/en/dateinterval.construct.php
$query = "UPDATE tablename SET datum='".$date->format('Y-m-d H:i:s')."'";
mysql_query($query);
}
?>
<form action="" method="post">
<button type="submit">Klik</button>
</form>
Gewijzigd op 17/05/2015 17:08:00 door Frank Nietbelangrijk
@Frank: Bij mij werkt dit script niet.
Wat werkt er niet? Ik raad wel aan om foutafhandeling in te bouwen in de query.
Het zijn natuurlijk slechts voorzetjes. Jezelf er in verdiepen is een must. En als het dan niet lukt is het handig om wat relevante code te laten zien.
Ik ben nu al aardig op weg. Maar alleen nog 1 vraag, hoe controleer je of de verstreken tijd al voorbij is?
Code (php)
Gewijzigd op 17/05/2015 20:23:11 door John De Zon
Haal de datum (timestamp) uit de database.
Kijk of time(), welke de unix-timestamp geeft, gelijk of hoger is dan de timestamp uit de database. Zo ja: tijd verstreken. Zo nee, niet verstreken.
Kijk of time(), welke de unix-timestamp geeft, gelijk of hoger is dan de timestamp uit de database. Zo ja: tijd verstreken. Zo nee, niet verstreken.
Na lang zoeken heb ik de oplossing gevonden. Voor als iemand de oplossing nog nodig heeft:
Dank je voor alle hulp!
Code (php)
Dank je voor alle hulp!
Gewijzigd op 18/05/2015 20:26:02 door John De Zon
Help! Als ik nu gewoon mijn $time_modified uit de database haal werkt de if($time_now < $db_time) niet.
Hoe kan ik dit oplossen?
Hoe kan ik dit oplossen?
Als je enerzijds (in je code) gebruik maakt van datum- en tijdfuncties in PHP, en anderzijds van datum- en tijdfuncties in je database (in je queries) dan ben je sowieso met twee maten aan het meten.
Het is niet gegarandeerd dat de klokken van je webserver en je database gelijk lopen.
Het is niet gegarandeerd dat de klokken van je webserver en je database gelijk lopen.
Maar ik zet gewoon de klok van mijn webserver in de database en haal ze er terug uit.
dag-maand-jaar is een onhandige notatie bij vergelijkingen. Ik neem tenminste aan dat het de bedoeling is dat "31 01 2015" kleiner is dan "01 02 2015".
Als je op basis van strings wilt vergelijken, moet je je datum als jaar-maand-dag formatteren.
Of, wat zelf mijn voorkeur zou hebben, de controle in je SQL-query te doen.
Toevoeging op 21/05/2015 21:16:14:
Overigens vind ik dit regeltje ook wel bedenkelijk:
Op zich is het niet fout en doet het misschien zelfs nog wat het moet doen, maar het suggereert dat je code gebruik maakt van de tijdreisfunctionaliteit in PHP.
Als je op basis van strings wilt vergelijken, moet je je datum als jaar-maand-dag formatteren.
Of, wat zelf mijn voorkeur zou hebben, de controle in je SQL-query te doen.
Toevoeging op 21/05/2015 21:16:14:
Overigens vind ik dit regeltje ook wel bedenkelijk:
Op zich is het niet fout en doet het misschien zelfs nog wat het moet doen, maar het suggereert dat je code gebruik maakt van de tijdreisfunctionaliteit in PHP.
Oh, inderdaad. Je formatteert je datums in een formaat waarbij je niet kunt sorteren / rekenen.
GG
GG
Ik sla standaard alle datums als yyyy-mm-dd op in de database.
Gewijzigd op 21/05/2015 21:18:18 door Paco de Wulp
Er van uitgaand dat je probleem "met twee maten meten" is.
Je zou dit kunnen oplossen door 2 timestamps op de halen de ene
is de huidige tijd (time_now) en de andere een instelde tijd (time_modified).
Je zou dit kunnen oplossen door 2 timestamps op de halen de ene
is de huidige tijd (time_now) en de andere een instelde tijd (time_modified).




