• User Attivo

    Utenti Collegati al sito

    Ciao a tutti,
    Vorrei far stampare (sul mio sito) tutti gli utenti che hanno effettuato il login sul mio sito.
    Premetto però che ad ogni utente che si collega al sito viene associata una sessione, quindi avevo pensato una cosa del genere.
    [Php]

    <?php
    $utenti = mysql_affected_rows($dbh);
    $utenti = $utenti + 2;
    print" ($utenti)";
    ?>
    [/Php]

    Utente Collegato
    [Php]
    <?php print $_SESSION['login'] ?>
    [/Php]

    Ho fatto
    $utenti = $utenti + 2;
    perchè facendo solo print" ($utenti)"; mi stampava (-1) e ancora devo capire perchè...comunque il problema sono le sessioni, perchè facendo in questo modo ogni utente che si collega al sito viene stampato solo il suo nome, quindi si ritroverà da solo in linea...

    P.s. se non vorrei utilizzare le sessioni per il login, ci sarebbe un'altro metodo ?


  • User Attivo

    Ciao infosicurezza,

    Le sessioni nascono in realtà per scopi diversi da quello per il quale vorresti utilizzarle.
    Infatti, come hai già fatto notare tu, una sessione vale solo per un utente: altro utente, altra sessione.

    Dal momento che andarsi a spulciare tutti i files di sessione per vedere chi è loggato e chi no non sarebbe un'ottima soluzione, ti consiglierei di creare uno script adatto allo scopo.

    Dovessi farlo io farei circa così:
    Creo una tabella sul db con i campi "utente" e "ultima_attivita".
    Quando un utente si logga lo inserisco nel database, quando si slogga lo rimuovo.

    Poi bisogna tenere conto di chi esce dal sito senza fare il logout e qui ci viene in aiuto quel secondo campo "ultima_attivita":
    Ogni volta che un utente loggato chiama una pagina del sito, aggiorniamo il campo "ultima_attivita" con l'ora attuale, oppure, se non ci dovesse essere il record di quell'utente, lo creiamo.

    A questo punto, per avere la lista degli utenti collegati basterà prendere dal database tutti gli utenti in quella tabella, per i quali non siano trascorsi più di 10 (o 12, 20 o quello che vuoi) minuti da "ultima_attivita". Già che ci siamo sfruttiamo anche il momento per rimuovere gli utenti che sono presenti nella tabella, ma per i quali sono già trascorsi i 10 minuti.

    Viene fuori uno script semplice (e magari migliorabile), ma fa egregiamente quello che ti serve... 😉


  • ModSenior

    Ciao infosicurezza,

    aggiungo una nota a quanto detto da lucabartoli, dovendo continuamente fare update della tabella, sarebbe bene crearla di tipo MEMORY per avere prestazioni migliori, visto che comunque una perdita di questi dati non credo sia catastrofica, mentre l'impatto sul carico del server sarebbe ridotto notevolmente non facendo continui accessi ai dischi.


  • User Attivo

    lucabartoli e TheDarkita ottime soluzioni, mi metto subito a lavoro, se avrò problemi posterò in questa sezione


  • User Attivo

    Eccomi di nuovo qui...
    allora ho creato una tabella con i rispettivi campi user e ultima_attivita
    Quindi ad ogni Login esattemente con questo codice
    [php]
    $inserisci = "INSERT INTO accesso LIMIT 1" . "(user)" . "VALUES('".$_POST[user]."')";
    [/Php]
    viene inserito nel database e stampato correttamente.
    Ora i miei problemi sono :

    • il valore del campo "ultima_attivita" lo devo fare di tipo INT oppure di un'altro tipo ?

    • per sapere se un utente rimane inattivo o chiude il browser senza fare il logout devo mettere su un cookie per la data e il tempo ?

    Ho un po di confusione perchè non ho molto tempo a disposizione Grazie


  • User Attivo

    Eccomi di nuovo qui...
    allora ho creato una tabella con i rispettivi campi user e ultima_attivita
    Quindi ad ogni Login esattemente con questo codice
    [php]
    $inserisci = "INSERT INTO accesso LIMIT 1" . "(user)" . "VALUES('".$_POST[user]."')";
    [/Php]
    viene inserito nel database e stampato correttamente.
    Ora i miei problemi sono :

    • il valore del campo "ultima_attivita" lo devo fare di tipo INT oppure di un'altro tipo ?

    • per sapere se un utente rimane inattivo o chiude il browser senza fare il logout devo mettere su un cookie per la data e il tempo ?

    Ho un po di confusione perchè non ho molto tempo a disposizione Grazie


  • ModSenior

    Il campo puoi farlo di tipo int e utilizzi il timestamp unix.
    La query deve essere tipo cosi:
    [php]
    INSERT INTO users_online (utente, time)
    VALUES ('$id_utente', '$time')
    ON DUPLICATE KEY UPDATE time = '$time'
    [/php]Inserendo il campo utente come primary key, e avendo:[php]$time = time();[/php]


  • User Attivo

    No scusa non mi è tanto chiaro.. io ho modificato così
    [php]
    $time = time();
    $inserisci = "INSERT INTO accesso LIMIT 1" . "(user, time)" . "VALUES ('$_POST[user]', '$time')
    ON DUPLICATE KEY UPDATE time = '$time'";
    [/php]
    però credo sia sbagliato... perchè io non utilizzo il campo ultima_attivita inoltre per il logout ho fatto così
    [php]
    $query = "DELETE user FROM accesso";
    $elimina = mysql_query($query) or die ("Cancellazione utente non riuscita");
    session_destroy();
    [/php]
    Non va... mi stampa l'errore che riporto nel codice (Cancellazione utente non riuscita)


  • User Attivo

    No scusa non mi è tanto chiaro.. io ho modificato così
    [php]
    $time = time();
    $inserisci = "INSERT INTO accesso LIMIT 1" . "(user, time)" . "VALUES ('$_POST[user]', '$time')
    ON DUPLICATE KEY UPDATE time = '$time'";
    [/php]
    però credo sia sbagliato... perchè io non utilizzo il campo ultima_attivita inoltre per il logout ho fatto così
    [php]
    $query = "DELETE user FROM accesso";
    $elimina = mysql_query($query) or die ("Cancellazione utente non riuscita");
    session_destroy();
    [/php]
    Non va... mi stampa l'errore che riporto nel codice (Cancellazione utente non riuscita)