[Città virtuale GPL]Utenti appesi: mobbasta! postato il 16/11/2008 16:35:37 nel forum programmazione, gdrcd e open source e modificato da armonica il 16/11/2008 16:39:47
Premessa: pur avendo messo in piedi Manaus, non sono un programmatore. Conosco il linguaggio html, mentre di php sono riuscito (con una grossa mano da parte di alcuni di voi, vero Xen?) giusto ad imparare ciò che mi serviva per adattare la land alle mie esigenze.
Chi utilizza il codice di Traimo si è di certo scontrato col problema degli utenti appesi in caso di logout non corretto: accade in pratica che chi esce chiudendo la finestra del browser, anzichè usando il tasto "esci", rimanga permanentemente nella lista degli online.
Un bug da poco, che rende ancora più frustrante il fatto di non riuscire a risolverlo. So che il problema è stato già oggetto di discussione in passato: per non ricorrere ogni volta al comando "do_sblocca", vi è chi ha suggerito di ricorrere ai popups, e chi di inserire una nuova voce nel database per eliminare la questione.
Tuttavia, ad un non-addetto-ai-lavori come me, pare impossibile che la cosa non possa essere risolta semplicemente modificando la pagina "do_login.php" (la posto qui sotto:è praticamente identica a quella dell'OS originale).
Pagine → 1
16/11/2008 17:15:25
non conosco gpl, quindi non sono in grado di fornirti una "stringa risolutrice", ma posso fornirti la teoria necessaria per farti superare questo problema.
Anzitutto devi creare un campo datetime nel db nella tabella dei presenti (non so com'è fatto il db, ma nel mio ho creato una tabella dei presenti).
poi crei una pagina in cui fai l'update di questo campo (lo chiamo refresh):
$Sql = "UPDATE presenti SET refresh = NOW() WHERE nome = '".$_SESSION['sessione relativa a chi fa il login']."'";
mysql_query($Sql);
e nella stessa pagina fai un controllo del genere:
$Sql = "DELETE FROM presenti WHERE DATE_ADD(refresh, INTERVAL 1 MINUTE) < NOW()";
mysql_query($Sql);
Tale pagina la includi in un'altra pagina che si refresha abbastanza spesso (io ad esempio ce l'ho inclusa nella pagina che aggiorna le missive).
In sintesi il codice va a modificare il campo "refresh" (tipo datetime), creato nella tabella dei presenti, inserendovi la data del momento in cui la pagina si aggiorna. Se un personaggio esce premendo la X in alto a destra, tale campo non verrà aggiornato. Così nel momento in cui tale pagina verrà nuovamente aggiornata da qualunque pg connesso, il personaggio suddetto sarà tolto dai presenti.
16/11/2008 22:12:42
questa è la parte di codice che va eliminata o ritoccata secondo esigenza ma è vero che crea altre problematiche ... direi più gravi dell'aver appeso qualche pg
****************************
// Utente online o sessione non scaduta
else if ($numonline == 1)
while($ROW2 = mysql_fetch_array($contonline))
{
$USER_ONLINE=$ROW2["USER_ONLINE"];
$VER_ONLINE=$ROW2["VER_ONLINE"];
$DIFFERENZA=($TIMESTAMP-$VER_ONLINE);
// La sessione è scaduta, l'utente non è collegato ed occorre aggiornare le variabili locali e di server
if ($DIFFERENZA > 70)
{
session_start();
session_unset();
session_destroy();
$sql = "DELETE FROM ONLINE WHERE USER_ONLINE='$USERNAME'";
$query = mysql_query ($sql, $connessione)or die(mysql_error());
echo "<link rel='stylesheet' href='stile.css' type='text/css'>";
echo('<body background="grafica/natura0080.jpg">');
echo "<div align=center class=RedTit>Per ragioni di sicurezza sei pregato di reinserire i tuoi dati.</div>";
echo "<br>";
echo "<br>";
echo "<div align=center><a href='login.php' class='standard'>Torna alla pagina di login</a></div>";
}
// La sessione è attiva, l'utente è collegato
else if ($DIFFERENZA < 70)
{
echo "<link rel='stylesheet' href='stile.css' type='text/css'>";
echo('<body background="grafica/natura0080.jpg">');
echo "<div align=center class=RedTit>Attenzione: l'utente risulta online.<br>Riprova ad accedere fra 60 secondi.</div>";
echo "<br>";
echo "<br>";
echo "<div align=center><a href='login.php' class='standard'>Torna alla pagina di login -</a></div>";
}
}
@mysql_close ($connessione);
16/11/2008 22:17:01
questa è la parte di codice che va eliminata o ritoccata secondo esigenza ma è vero che crea altre problematiche ... direi più gravi dell'aver appeso qualche pg
****************************
// Utente online o sessione non scaduta
else if ($numonline == 1)
while($ROW2 = mysql_fetch_array($contonline))
{
$USER_ONLINE=$ROW2["USER_ONLINE"];
$VER_ONLINE=$ROW2["VER_ONLINE"];
$DIFFERENZA=($TIMESTAMP-$VER_ONLINE);
// La sessione è scaduta, l'utente non è collegato ed occorre aggiornare le variabili locali e di server
if ($DIFFERENZA > 70)
{
session_start();
session_unset();
session_destroy();
$sql = "DELETE FROM ONLINE WHERE USER_ONLINE='$USERNAME'";
$query = mysql_query ($sql, $connessione)or die(mysql_error());
echo "<link rel='stylesheet' href='stile.css' type='text/css'>";
echo('<body background="grafica/natura0080.jpg">');
echo "<div align=center class=RedTit>Per ragioni di sicurezza sei pregato di reinserire i tuoi dati.</div>";
echo "<br>";
echo "<br>";
echo "<div align=center><a href='login.php' class='standard'>Torna alla pagina di login</a></div>";
}
// La sessione è attiva, l'utente è collegato
else if ($DIFFERENZA < 70)
{
echo "<link rel='stylesheet' href='stile.css' type='text/css'>";
echo('<body background="grafica/natura0080.jpg">');
echo "<div align=center class=RedTit>Attenzione: l'utente risulta online.<br>Riprova ad accedere fra 60 secondi.</div>";
echo "<br>";
echo "<br>";
echo "<div align=center><a href='login.php' class='standard'>Torna alla pagina di login -</a></div>";
}
}
@mysql_close ($connessione);
17/11/2008 14:01:43
Io risolsi appunto con il campo VER_ONLINE che c'è nella tabella ONLINE.
In refresh.php ho aggiunto una query che seleziona questo dato per tutti gli on-line. Poi cicla tutto facendo la sottrazione tra il time attuale e il dato preso da db. Se è minore maggiore di 120 cancella quell'utente dal db altrimenti gli aggiorna il campo VER_ONLINE con il time attuale. Aggiungendo un controllo simile anche al login anche se l'ultima persona ad uscire dovesse rimanere appesa e fosse la prima a rientrare si troverebbe già sbloccato.
17/11/2008 14:50:29
Perchè non creare una bella patch??
17/11/2008 15:24:31
17/11/2008 19:13:12
Discussione seguita da
Pagine → 1
Rispondi alla Discussione Aggiungi ai Preferiti Inoltra Discussione Forum Programmazione, GDRCD e Open Source Elenco Forum
I dati del generatore di rank sono stati aggiornati!