-
Sessioni e mysql
Salve a tutti,nel mio sito ho creato una piattaforma registrazione-login perfettamente funzionante.Dopo averla testata ho messo un blocco nel menù raffigurante gli utenti online,facendo si che quando un utente si loggasse fosse aggiuno alla tabella degli utenti online e che quando effettuasse il logout venisse cancellato dalla suddetta tabella.Da questa tabella ho fatto un select e l'ho messo in home.Non avevo però considerato una cosa.Dopo un pò la sessione termina...come faccio ad eliminare il record di un utente alla quale la sessione è scaduta?Grazie anticipatamente per le vostre risposte.
-
Io metterei un campo in cui inserire il timestamp al momento del login.
Poi fai un controllo per vedere se la differenza tra il timestamp attuale e quello del login è uguale a x secondi.
Se è così elimini il record.
Nel phpinfo sotto la direttiva session.gc_maxlifetime dovrebbe esserci scritto il numero di secondi dopo i quali una sessione scade.
EDIT: Ho controllato, è 1440.
Quindi puoi fare così:
if((time()-$timestamp_login)>1440){
// cancello il record
}
-
Il timestamp del login ce l'ho.
Quindi facendo così una cosa del genere va bene?
Codice PHP:
<?php
$query = "SELECT * FROM USERS where username=$_SESSION['username']");
$row = mysql_fetch_array($query);
$now = date("Y-m-d h:i:s");
E per calcolare la differenza tra ora e timestamp(ultimo login),cheper esempio vorrei che se gosse due ore distruggesse la sessione come si fa?
Edit: ho postato due secondi dopo l'edit tuo:D,ma se io uso il formato ora:minuto:secondo non posso fare la sottrazione no?
-
Non sono sicuro, ma la sessione dovrebbe scadere dopo x secondi di inattività, non dopo x secondi da quando è stata creata, quindi un altro modo per effettuare quello che chiedi, è scrivere un record ad ogni pagina che si visita, e cancellare tutti quelli presenti per quel nick, e poi controllare il timestamp con quello impostato nell'ultimo record...
-
@jostock Sinceramente non ho capito bene quello che hai detto.Puoi spiegare meglio?Caso mai con qualche esempio
-
per prima cosa crei una tabella di nome attivita, con i campi id, nick(o id nell'utente), timestamp
poi in ogni pagina inserisci questo codice:
Codice PHP:
mysql_query("DELETE FROM attivita WHERE nick = '" . $nick . "'")
mysql_query("INSERT INTO attivita (nick, timestamp) VALUES ('" . $nick . "', '" . timestamp() . "')");
$timestamp = timestamp() - 900;
mysql_query("DELETE FROM attivita WHERE timestamp < " . $timestamp);
Questo codice esegue 3 query, la prima elimina tutte le attività dell'utente che sta visitando la pagina, poi crea una nuova attività per l'utente, ed infine cancella tutti i record più vecchi di 15 min (900 secondi) così non si vedono nel blocco :wink:
-
grazie molte.Ma se l'utente è un visitatore e non è quindi loggato la query viene eseguita lo stesso.
Quindi forse è meglio sostituire così,correggimi in caso contrario:
Codice PHP:
if(isset($_SESSION['username'])){ //e controllo se l'utente è loggato
mysql_query("DELETE FROM attivita WHERE nick = '" . $nick . "'")
mysql_query("INSERT INTO attivita (nick, timestamp) VALUES ('" . $nick . "', '" . timestamp() . "')");
$timestamp = timestamp() - 900;
mysql_query("DELETE FROM attivita WHERE timestamp < " . $timestamp);
}else{
exit();
-
Togli quell'exit() dopo l'else, o l'esecuzione dello script verrà terminata se l'utente che visita la pagina è un visitatore (ovvero la variabile $_SESSION['username'] non è impostata).
Anzi, togli proprio l'else, che in questo caso è inutile (e che tra l'altro manca della parentesi di chiusura :mrgreen:).
-
E quindi così
Codice PHP:
if(isset($_SESSION['username'])){ //e controllo se l'utente è loggato
mysql_query("DELETE FROM attivita WHERE nick = '" . $nick . "'")
mysql_query("INSERT INTO attivita (nick, timestamp) VALUES ('" . $nick . "', '" . timestamp() . "')");
$timestamp = timestamp() - 900;
mysql_query("DELETE FROM attivita WHERE timestamp < " . $timestamp);
}
Dovrebbe fungere?
-
Citazione:
Originalmente inviato da
phelpp
E quindi così
Codice PHP:
if(isset($_SESSION['username'])){ //e controllo se l'utente è loggato
mysql_query("DELETE FROM attivita WHERE nick = '" . $nick . "'")
mysql_query("INSERT INTO attivita (nick, timestamp) VALUES ('" . $nick . "', '" . timestamp() . "')");
$timestamp = timestamp() - 900;
mysql_query("DELETE FROM attivita WHERE timestamp < " . $timestamp);
}
Dovrebbe fungere?
in teoria si, in pratica lo devi provare