$_SESSION na 24 uur verwijderen
Is het ook mogelijk om een sesie na 24 uur te verwijderen, zo ja hoe?
Meestal verdwijnt deze al na een half uur, zie de instellingen van jouw server.
Gewijzigd op 01/01/1970 01:00:00 door mvos
Ja, een DATETIME waarde opslaan op het moment van posten met de MySQL functie NOW(). Dan kun je met TIME_DIFF checken of er al 24 * 3600 seconden verlopen zijn.
okay, bedankt voor de hulp :)
Dat maakt de controles waterdicht.
Het zou een beetje lullig zijn als die 86400 seconden uit je voorbeeld nog niet verstreken zijn maar de sessie wel al vernietigd wordt omdat ze maximale levensduur overschreden wordt.
De oplossing met de database is hier in ieder geval het beste...
Je kunt ook via cookies (minder net, maar oké..) een code opslaan die ook bij het IP/de gebruiker wordt opgeslagen. Check dan ook weer of de laatste klik niet 24 uur geleden is, etc. ;)
Gewijzigd op 01/01/1970 01:00:00 door Jesper Diovo
Ik heb is wat rond gekeken tussen turtials hier op het forum, en ik heb wat op google gezocht, maar ik kom er nog niet echt uit hoe ik met TIME_DIFF kan kijken of er al 24 uur voorbij zijn. weet iemand mischien hoe je dat moet doen?
Misschien kan je hier wat mee :)
Erik Rijk schreef op 30.01.2008 16:47:
Ga dan wel met standaard SQL aan de slag en niet dat MySQL-gebrabbel.$sql = "SELECT * FROM tabelnaam WHERE DATE_SUB(NOW(),INTERVAL 1 DAY) <= last_online";
Misschien kan je hier wat mee :)
Misschien kan je hier wat mee :)
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
SELECT
COUNT(1) AS aantal
FROM
tabelnaam
WHERE
datum > NOW() - INTERVAL 1 DAY
AND
user_id = 23
COUNT(1) AS aantal
FROM
tabelnaam
WHERE
datum > NOW() - INTERVAL 1 DAY
AND
user_id = 23
Wanneer aantal dan groter is dan 0, mag user 23 geen nieuw topic aanmaken. Dat kun je eenvoudig in PHP controleren.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ip = $_SERVER['REMOTE_ADDR'];
$sql = "SELECT ip FROM `gastenboek` WHERE ip LIKE '%$ip%'";
$query = mysql_query($sql) or die('Fout in mysql!');
while($check = mysql_fetch_array($query)) {
if($_SERVER['REMOTE_ADDR'] == $sql){
$ip = $_SERVER['REMOTE_ADDR'];
$sql = "SELECT * FROM `gastenboek` WHERE ip LIKE '%$ip%' MINUTE(TIMEDIFF(CURTIME(), check)) < 1440";
$query = mysql_query($sql) or die('Fout in mysql!');
if(???????????){
echo 'U kunt maar een keer in de 24 uur posten!';
}
else
{
echo $form;
}
}
else
{
echo $form;
}
}
$sql = "SELECT ip FROM `gastenboek` WHERE ip LIKE '%$ip%'";
$query = mysql_query($sql) or die('Fout in mysql!');
while($check = mysql_fetch_array($query)) {
if($_SERVER['REMOTE_ADDR'] == $sql){
$ip = $_SERVER['REMOTE_ADDR'];
$sql = "SELECT * FROM `gastenboek` WHERE ip LIKE '%$ip%' MINUTE(TIMEDIFF(CURTIME(), check)) < 1440";
$query = mysql_query($sql) or die('Fout in mysql!');
if(???????????){
echo 'U kunt maar een keer in de 24 uur posten!';
}
else
{
echo $form;
}
}
else
{
echo $form;
}
}
maar ik kom er alleen niet uit wat er in de 'if' moet staan waar de vraagtekens staan
Weg met or die()! Zo'n lompe manier van foutafhandeling... Haal or die(".....") weg uit je script, en controleer na $query = mysql_query($sql) of $query true is. Is dat zo, ga dan door. Gebruik overigens duidelijkere variabelen. $sql is hier niet nodig, daarvoor zou je $query kunnen gebruiken. Waar nu $query staat, hoort eigenlijk $result.
Je controleert eveneens fout bij $_SERVER['REMOTE_ADDR']. Dat is het IP, en dus niet gelijk aan je $sql (in dit geval). Je hoeft hier niet te controleren of het IP daadwerkelijk dat is, dat doet je query namelijk al.
Ik zou bij de post een tijd opslaan van posten (als dat al niet wordt gedaan), dan hoef je geen tweede query te gebruiken en kun je via een if kijken of de tijd 24 uur geleden is. Óf je doet dat direct al in je eerste query ;).
het tijd opslaan en zo heb ik al maar als ik bij bijvoorbeeld de tijd 15:52:36 1440(aanal minuten in een dag) aftrek dan kom er toch een min getal uit of is dat niet het geval?
Maar als je de browser afsluit kun je weer opnieuw posten. Geld ook voor als je uitlogd (dus er in je script session_destroy(); staat)..
mvos schreef op 30.01.2008 17:30:
Je slaat op wanneer een record wordt aangemaakt en dat doe je in een DATETIME (MySQL). Die heeft dus het formaat yyyy-mm-dd hh:mm:ss. Vervolgens ga je met een simpele query kijken of er al een dag of 24 uur is verstreken en klaar ben je.het tijd opslaan en zo heb ik al maar als ik bij bijvoorbeeld de tijd 15:52:36 1440(aanal minuten in een dag) aftrek dan kom er toch een min getal uit of is dat niet het geval?
INTERVAL 1 DAY
INTERVAL 24 HOUR
INTERVAL 5 MINUTE
En zo zijn er nog wel een paar voorbeelden te verzinnen. Rekenen in minuten, bv. 1440, is niet aan te raden, dat is niet duidelijk en kan alleen maar problemen opleveren. Hou je aan de SQL-standaard, die is duidelijk en laat maar weinig ruimte voor fouten. En dat is precies zoals je het hebben wilt!
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ip = $_SERVER['REMOTE_ADDR'];
$sql = "SELECT ip FROM `gastenboek` WHERE ip LIKE '%$ip%'";
if(mysql_query($sql)){
$ip = $_SERVER['REMOTE_ADDR'];
$sql = "SELECT * FROM `gastenboek` WHERE ip LIKE '%$ip%' AND time > NOW() - INTERVAL 1 DAY";
if(mysql_query($sql)){
echo 'U kunt maar een keer in de 24 uur posten!';
}
else
{
echo $form;
}
}
else
{
echo $form;
}
$sql = "SELECT ip FROM `gastenboek` WHERE ip LIKE '%$ip%'";
if(mysql_query($sql)){
$ip = $_SERVER['REMOTE_ADDR'];
$sql = "SELECT * FROM `gastenboek` WHERE ip LIKE '%$ip%' AND time > NOW() - INTERVAL 1 DAY";
if(mysql_query($sql)){
echo 'U kunt maar een keer in de 24 uur posten!';
}
else
{
echo $form;
}
}
else
{
echo $form;
}
en de kolom check heeft een DATETIME
In de 2e query loop je met backtics ` en LIKE te klooien. Backtics ` mag je ritueel verbranden en LIKE mag je vervangen door een =.
Maar waarom doe je niks met het voorbeeld van 30.01.2008 16:53 uur? Zonder foutafhandeling heb je overigens geen recht tot klagen, mocht er dan wat fout gaan, is het per definitie jouw eigen schuld. Ga dus eerst maar eens wat aan foutafhandeling doen.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
$ip = $_SERVER['REMOTE_ADDR'];
$sql = "SELECT COUNT(1) AS aantal FROM tabelnaam WHERE check > NOW() - INTERVAL 1 DAY AND ip = $ip";
if(mysql_query($sql )or die('Fout in mysql!')){
echo 'U kunt maar een keer in de 24 uur posten!';
}
else
{
echo $form;
}
$sql = "SELECT COUNT(1) AS aantal FROM tabelnaam WHERE check > NOW() - INTERVAL 1 DAY AND ip = $ip";
if(mysql_query($sql )or die('Fout in mysql!')){
echo 'U kunt maar een keer in de 24 uur posten!';
}
else
{
echo $form;
}
maar hij geeft nu Fout in mysql!
Voorbeeldje:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
$ip = $_SERVER['REMOTE_ADDR'];
$query = "SELECT COUNT(1) AS aantal FROM tabelnaam WHERE check > NOW() - INTERVAL 1 DAY AND ip = '".$ip."'";
// VERANDER WEL DE tabelnaam en de veld namen in de query!!!
$result = mysql_query($query);
if($result) {
// succes
} else {
// geen succes
}
?>
$ip = $_SERVER['REMOTE_ADDR'];
$query = "SELECT COUNT(1) AS aantal FROM tabelnaam WHERE check > NOW() - INTERVAL 1 DAY AND ip = '".$ip."'";
// VERANDER WEL DE tabelnaam en de veld namen in de query!!!
$result = mysql_query($query);
if($result) {
// succes
} else {
// geen succes
}
?>