Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2013
    Messaggi
    17

    chiudere la sessione anche quando chiudo il browser

    Salve a tutti , dunque ho un problema , ho creato un sito con registrazione e login , l'utente una volta loggato entra in una parte privata attraverso il salvataggio dei dati in una sessione.

    quando finisce di fare quello che deve basta che clicca su esci e tutto va a meraviglia.

    Successivamente ho pensato che siccome volevo tenere traccia e stampare gli utenti online , ho creato una tabella dinamica in phpmyadmin dove vengono salvati momentaneamente gli utenti online e al logout cancellati.

    quindi la tabella risulta vuota quando si escce e con n elementi a seconda di chi si logga.


    il mio problema rimane quando invece di fare il logout tramite pulsante chiudo la pagina.

    se vado a ricaricare mi ritorna nella pagina privata e non distrugge la sessione, vi posto il codice di modo che potete dare un'occhiata:

    Codice PHP:
    <?php

        
    include 'header.php';
       
    ?>

        <div id="wrapper">
        
            <?php
            
                $p 
    $_GET['azione'];
                
                
    // login.php?azione=login
                
    if($p == "login"){
                
                    if(!isset(
    $_POST['invia'])){ ?>
                        
                        <form method="post" action="#" id="formlogin">
                        <h2 align="left">Login</h2>
                        <hr noshade></hr>
                            <label for="username"align="left">Username</label>

                            <input type="text" name="username" id="username" />



                            <label for="password" align="left">Password</label>

                            <input type="password" name="password" id="password" />



                            <input type="submit"  align="left" name="invia" id="login" value="Accedi" />
                        <hr noshade></hr>
                        </form>
                        
    <?php             } else {

                        
    $username mysql_real_escape_string($_POST['username']);
                        
    $password mysql_real_escape_string($_POST['password']);
                        
                        if(
    $username == "" || $password == ""){
                        
                            echo 
    "Attenzione, devi compilare tutti i campi";
                        
                        } else {
                        
                            
    $password_cript md5($password);
                            
                            
    $recuperadati mysql_query("SELECT * FROM utente WHERE username = '$username' AND password = '$password_cript'");
                            
                            
    $verificadati mysql_num_rows($recuperadati);
                            
                            if(
    $verificadati == 1){
                            
                                
    $sessione mysql_fetch_array($recuperadati);
                                
    $_SESSION['utente'] = $sessione['username'];
                                echo 
    "<label>Login effettuato con successo!</label>";
                                
    header("Refresh: 2; URL= index.php");
                            
                            } else {
                            
                                echo 
    "Dati non presenti nel database!";
                            
                            }
                        
                        
    $ut=$_SESSION['utente'];
                    
                    
    $prendionline=mysql_query("SELECT username FROM utente WHERE username='$ut'");
                    
    $rows mysql_fetch_array($prendionline);
                    
    $username $rows['username'];
                    
                    
    $immettionline=mysql_query("INSERT INTO utente_online (username) VALUES ('$username')");
                    
                    
    $stampautenteonline=mysql_query("SELECT * FROM utente_online");
                                    
    $conta=mysql_num_rows($stampautenteonline);
     
                                    
    $i=0;
                                    while (
    $i $conta
                                {
                                    
    $username=mysql_result($stampautenteonline,$i,"username");
                               
                                    
                                   
                                    
    $i++;
                                }
                        }
                     
                    }
                
                
                
    // login.php?azione=logout
                
    } elseif ($p == "logout"){
                                    
    session_destroy();
                                    
    $ut=$_SESSION['utente'];
                        
    $eliminautentionline mysql_query("DELETE FROM utente_online WHERE username='$ut'");
                                    echo 
    "


    <h3><center>Ciao ciao "
    .$ut." torna presto,ti aspettiamo</center></h3>";
                    
    header("Refresh: 2; URL= index.php");
                    }
                    
                
    ?>
        
        
        
        </div>
        
    </body>
    </html>

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,445
    Problematica discussa già più volte, non si può fare.

    Anche su questo forum (e in tutti gli altri forum) se ci fai caso, un utente che chiude il browser risulta comunque online fino al seguente refresh del sistema.

    Quindi devi prevedere una funzione che viene eseguita ogni tot tempo e che ti tenga aggiornata la situazione degli utenti online.
    Ovviamente puoi fare che la funzione si avvii ogni secondo in modo da avere un aggiornamento quasi in tempo reale, ma questo creerebbe un gran carico al server, l'intervallo dovrà essere più lungo e commisurato al carico effettivo che il server deve sostenere.

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2013
    Messaggi
    17
    ti ringrazio , come sarebbe la funzione che permetterebbe tutto ciò ?

  4. #4
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,445
    Non dovrei aiutarti perché sono di un paese rivale storico del tuo (e già dovresti aver capito di dove sono), ma sono anche una brava persona, quindi te lo dico

    Una gestione semplice potrebbe essere la seguente.
    Crei sul db una tabella con id utente e timestamp per l'ultima azione effettuata.
    In pratica quando un utente effettua il login va registrato in sessione l'accesso e contestualmente va anche registrato sul db assieme ad un timestamp, ogni volta che l'utente fa qualcosa andrà aggiornato il timestamp relativo alla entry dell'utente all'interno della tabella.

    Se l'utente effettua il logout, elimini anche la sua entry dalla tabella.

    In questo modo c'è sempre il timestamp dell'ultima attività dell'utente.

    La funzione per gli utenti online sarà semplicissima:
    - per prima cosa cancella tutte le entry più vecchie di tot (a tua scelta) minuti (non secondi, un utente può stare qualche minuto su una pagina a leggere senza fare altro) in modo da eliminare gli utenti inattivi da lungo tempo e che presumibilmente non sono più online.
    - legge le entry rimaste che corrispondono agli utenti presumibilmente attivi
    - mostra tali utenti come attivi

    Ovviamente cancellando un utente dalla tabella, non devi toglierlo anche dalla sessione, perché magari hai impostato 10 minuti per definire l'inattività e tale utente sta solo leggendo qualcosa che gli sta richiedendo più tempo e quindi non deve ritrovarsi buttato fuori, perché in realtà è ancora lì.
    Un utente non "sloggato", che però è stato dichiarato "inattivo" e quindi eliminato dalla tabella, quando effettua una nuova azione, deve essere reinserito nella tabella degli attivi anche senza dover rifare il login.

    In pratica la funzione che aggiorna il timestamp deve prima verificare se esiste già una entry per l'utente, se esiste l'aggiorna, se non esiste la crea.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2021
    Messaggi
    1
    Ciao Alhazred, anche dopo anni e anni la tua risposta è molto utile, ti ringrazio! Credo che l'Italia non ha paesi rivali e semmai ti rivolgi di nuovo ad un italiano, ascolta prima per due minuti la canzone di De Gregori "Generale" (la guerra è finita).

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.