$_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.
ok, bedankt maar is het dan ook mogelijk om op een andere manier er voor te zorgen dat bezoekers maar 1 keer in de 24 uur kunne posten?
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 :)
Mocht je bv. PostgreSQL gebruiken, dan kun je dit met een CHECK-constraint oplossen. Dan hoef je niet apart te controleren met PHP en een extra query of iemand opnieuw mag posten. Een nieuwe post zal keurig mislukken wanneer de 24 uur nog niet is verstreken.
Dat maakt de controles waterdicht.
Dat maakt de controles waterdicht.
Je zou het op de volgende manier met php kunnen doen:
Zo zet je de sessie.
Zo controleer je 'em
Zo zet je de sessie.
Code (php)
Zo controleer je 'em
Gewijzigd op 01/01/1970 01:00:00 door Erik Rijk
Helaas heb je niet echt veel controle over de levensduur van sessies aangezien dit vastgelegd is in je php.ini en je daar bij je host vaak niet bij kunt.
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...
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...
Sla in je database iedere klik op (via IP). Controleer bij iedere klik of de tijd van de laatste klik niet 24 uur geleden is. Is dat zo, unset de sessie dan. Is dat niet zo, vernieuw de sessie.
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. ;)
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?
$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 :)
'Erik:
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.
ik heb nu dit:
maar ik kom er alleen niet uit wat er in de 'if' moet staan waar de vraagtekens staan
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
Om op een IP te controleren, hoef je geen LIKE te gebruiken. Gebruik gewoon '=', dus die % om $ip kunnen ook weg. Zet 'm trouwens wel buiten de quotes.
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 ;).
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:
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!
ik heb nu dit maat her werkt niet echt:
en de kolom check heeft een DATETIME
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
De eerste query gooi je weg, slaat helemaal nergens op.
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.
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!
Je moet die or die en mysql_query ook niet in de if() zetten.
Voorbeeldje:
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
}
?>




