Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    129

    Offline e online usuario

    Salve,

    sto creando una web e da una paio di giorni sono bloccato su uno script che non riesco a far funzionare.
    Voglio che le persone inscritte, al entrare con login nella web, risultino come "online".
    Nella base di dati ho un campo con nome "stato" dove al entrare con sessioni o con coockie cambia con valore online o offline. Questo mi permette sapere chi è connesso e chi no.
    Il problema è quando l'usuario chiude la finestra del navigatore, non potendo chiamare nessun script non so come cambiare il valore a offline nella base di dati.

    Ho pensato di usare nel body:
    codice:
    <body onbeforeunload=funzione()>
    Nell'head:
    codice:
     <!--<script type="text/javascript">
      function funzione()
      {
       $.ajax({
       url: 'php/offline.php',
       type: 'post',
       data: '',
       success: function() 
         {
         alert(ok');
         }
       });
      }
     </script>
    E il file php:
    Codice PHP:
    <?php
     
    include "config.php";
     
    $DB = new DB();
     
    $DB->connect();
     
    session_start();
     
    $id_usuario_out $_SESSION['id_usuario_ses'];
     
    $sqlonline "UPDATE usuario SET estado = 'offline' WHERE id_usuario = '$id_usuario_out' LIMIT 1";
     
    $onlineses mysql_query($sqlonline);
     
    $last_onlineses mysql_insert_id();
    }
    ?>
    Come mai non mi funciona?
    Per voi il ragionamento è giusto? Faccio bene a usare onbeforeunload?
    Secondo me sbaglio la connessione tra php e JavaScript, ho provato di tutto...
    QUello che voglio ottenere è il classico online e offline (come nelle chat), che già si usa da anni...

    Grazie mille!

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,503
    Purtroppo non c'è modo di essere sicuri che questo sistema funzioni e non c'è nessuna alternativa.
    Se ci fai caso infatti, ovunque, anche su questo forum, un utente risulta online anche dopo che ha chiuso il browser, poi ci pensa una funzione che viene avviata di tanto in tanto a controllare chi è ancora online e chi no.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    129
    Quindi la mia teoria è esatta...
    E quale sarebbe la funzione, come potrei fare il controllo?

    Riguardo al códice sai perchè non funziona? ho collegato bene JavaScript con php?

  4. #4
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,503
    Generalmente onbeforeunload funziona se deve agire solo sul browser, ad esempio è usato da quelle pagine che ti mostrano il messaggio "Sei sicuro di voler abbandonare la pagina..." quando provi a chiuderla.
    Il problema nasce quando alla chiusura della pagina devi effettuare una chiamata sul server, in quel caso lì la chiamata non parte.

    Potresti creare una tabella con 2 campi: id e timestamp
    Nel campo id ci metti l'id degli utenti che effettuano il login, nel campo timestamp ci va il timestamp dell'ultima operazione effettuata da ogni utente.
    In pratica ogni volta che l'utente fa qualcosa, anche la semplice apertura di una pagina del tuo sito, devi aggiornare il suo timestamp in questa tabella (o aggiungere una nuova entry se non esiste).
    Oltre a questo, la funzione che aggiornerà la tabella deve cancellare le entry con timestamp più vecchio di... decidi tu quanto tempo.
    Così se ad esempio decidi che un utente p da ritenersi offline se non fa niente da 5 minuti, tu cancelli le entry con timestamp più vecchi di 5 minuti.
    Per indicare chi è online e chi è offline leggi questa tabella.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    129
    Ah ok, lo avevo pensato... dovró creare nel pannello di controllo un bottone che chiami la funzione.

    Si, lo script sembrava funzionare pero non mi registra nella base di dati i cambi e stavo impazzendo.
    Per quello che mi dici è normale già che la chiamata al chiudere la finestra non parte...

  6. #6
    più semplicemente le sessioni lavorano con una funzione di garbage..

    se associ la funzione di garbage alla tua classe sessioni o associ direttamente una funzione di garbage alle sessioni puoi far si che dopo un certo periodo le sessioni si puliscano da sole..

    es
    codice:
    session_set_save_handler( 'open', 'close', 'read', 'write', 'destroy', 'gc' );
    
    function gc( $maxlifetime ) {
       $pdo = new PDO( 'tuoi dati' );
       $query = "DELETE FROM sessions WHERE expiry < DATE_SUB(NOW(), INTERVAL $maxlifetime SECOND)";
       $pdo->execute( $query );
       return TRUE;
    }
    oppure come classe:
    codice:
    class session {
    
        private $pdo;
    
        public function __construct( myPDO $pdo ) {
            $this->pdo = $pdo;
            session_set_save_handler(
                array($this, 'open'),
                array($this, 'close'),
                array($this, 'read'),
                array($this, 'write'),
                array($this, 'destroy'),
                array($this, 'gc')
            );
            session_start();
        }
    
        public function open($path, $name) {
        }
    
        public function close() {
        }
    
        public function read( $id ) {
        }
    
        public function write( $id, $data ) {
        }
    
        public function destroy( $id ) {
        }
    
        public function gc( $maxlifetime ) {
            $query = "DELETE FROM sessions WHERE expiry < DATE_SUB(NOW(), INTERVAL $maxlifetime SECOND)";
            $this->pdo->executeQuery( $query );
            return TRUE;
        }
    }
    Questa volta, più che un voto.. è favoreggiamento.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.