Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [phpbb] mio utenti on-line non funziona bene...

    Sulla home page di un mio sito voglio segnalare quanti sono gli utenti on-line e nel forum... e mi baso perciò sul database del forum... visto che quel poco di sito che c'è è abbastanza integrato con esso (riprende le sue sessioni insomma...)

    Il problema è che, mi dicono gli utenti, spesso il mio scrptino mi da molti più utenti on-line di quanti ne dia il forum (centinaia conto poche decine)..

    ecco il mio codice:
    Codice PHP:
    //utenti on-line
        
    $sql "SELECT session_time,session_page
        FROM "
    .SESSIONS_TABLE."
        WHERE session_time >= "
    .( time() - 300 ).';';

       
    $result $db->sql_query($sql);
       
    $numero_utenti $db->sql_numrows($result);
       echo 
    "Utenti online: $numero_utenti - ";
      
    //utenti nel forum
      
    $num_utenti_forum 0;
      while ( 
    $row $db->sql_fetchrow($result) )
       {
         if ( 
    $row['session_page'] > -12 )   $num_utenti_forum++;
        
    /*
         le varie sezioni del forum sono individuate con delle costanti numeriche definite 
         in include/costants.php da 0 a -12 sono le costanti predefinite di phpbb.. sotto il -12
        (cioè -13 e minori) sono costanti che ho aggiunto io per alcune sezioni del sito
       */
       
    }
      echo 
    "di cui nel forum: $num_utenti_forum 
    "

    Non ci sono notice.
    Purtroppo non sono riuscito a beccare io stesso un momento in cui il conto era sballato per provare all'istante la query da phpmyadmin..

    questo è quello che fa phpbb stesso invece
    Codice PHP:
    //
    // Get user list
    //
    $sql "SELECT u.user_id, u.username, u.user_allow_viewonline, u.user_level, s.session_logged_in, s.session_time, s.session_page, s.session_ip
        FROM "
    .USERS_TABLE." u, ".SESSIONS_TABLE." s
        WHERE u.user_id = s.session_user_id
            AND s.session_time >= "
    .( time() - 300 ) . "
        ORDER BY u.username ASC, s.session_ip ASC"
    ;
    if ( !(
    $result $db->sql_query($sql)) )
    {
        
    message_die(GENERAL_ERROR'Could not obtain regd user/online information'''__LINE____FILE__$sql);
    }
    //continua con una lunga sezione di stampa.... 
    mi smebra che faccio la stessa cosa, informazioni di identità a aprte...


    qualcuno mi aiuta a scovare il bug?

  2. #2
    beccato ora con l'errore.... dall'ammisnitrazione del forum mirisultano centinaia di connessioni d aun solo ip (spidr probabilmente).. ecco risolto il mistero..

    pensavo che già il database filtrasse i doppioni (ovvero che ci fosse una sola sessione per ip...).. evidentemente non è così

  3. #3
    Codice PHP:
    ....

            if ( 
    $row['session_ip'] != $prev_ip )
            {
                
    $username $lang['Guest'];
                
    $view_online true;
                
    $guest_users++;
        
                
    $which_counter 'guest_counter';
                
    $which_row 'guest_user_row';
            }
        }

        
    $prev_ip $row['session_ip'];
    .... 
    ed ecco come vengono filtrati gli ip....

    poichè la query ordina per ip... se è uguale al precedente, si scarta..

    Ma non c'è un modo più immediato per filtrarli direttamente in query??? :master:

  4. #4
    Utente di HTML.it L'avatar di Nix82
    Registrato dal
    Oct 2001
    residenza
    Mussolente (VI)
    Messaggi
    1,122
    Originariamente inviato da }gu|do[z]{®©
    Ma non c'è un modo più immediato per filtrarli direttamente in query??? :master:
    No
    ma questo in ogni classe di utenti in linea
    prima devo avere tutti gli indirizzi IP che sono dentro al db [e con questo ho anche il loro ultimo accesso sempre se dentro al $range imposto da te] [e aggiungo che qua hai già eseguito la query e hai già fatto una fetch] e solo dopo tramite IF riesco a scartare/aggiungere/cancellare/aggiornare quelli effettivamente in linea.
    Per sapere solo il NUMERO e non anche lo username puoi usare anche solo gli IP e non le sessioni [questo va bene se vuoi farti una tabelle di user on line separata da phpBB ma interagente con essa].
    La cultura è il nostro passaporto per il domani. Il futuro appartiene alle persone che si preparano oggi.
    Martin Luther King

  5. #5
    sì sì.. poi ho risolto ciclando su tutto il risultato (ordinato per ip) e un "last ip" per scartare i doppioni.. in modo praticamente identico al codice del phpbb

    Pare fuzionare bene..

    mi chiedevo solo se c'era un modo pereliminare i doppioni direttamente in fase di query.. ma il distinct nno si può usare.. almeno non in una query normale... perchè gli altri campi sono sempre divers a parità di ip.. e quindi non risolvo nulla

    vabbè.. poco male...
    In realtà non avevo capito da cosa dipendeva il coteggio errato.. quando l'ho capito non è stato un problema risolvere

    :ciuaz:

  6. #6
    Utente di HTML.it L'avatar di Nix82
    Registrato dal
    Oct 2001
    residenza
    Mussolente (VI)
    Messaggi
    1,122
    Ti lascio qui il method che ho creato per il phpnix 4. Funziona alla grande ed è similare a quello del phpBB

    Codice PHP:
            // METHOD: this method add or delete users in ONLINE_TABLE [I call this method in header()]
        
    private function online_function() 
        {
            
    $sql "SELECT * FROM " ONLINE_TABLE;
                
    $result $this->db->sql_query($sql);
                
                
    // Now I delete all users with their time > gb_config['onlin_seconds']
                
    $time time();
                if( 
    $this->get_db_stat('onlinecount') > )
            {    
                while( 
    $row $this->db->sql_fetch_row($result) )
                {
                    
    $sql "DELETE FROM " ONLINE_TABLE " WHERE online_time < " . (time()-$this->gb_config['online_seconds']);
                    
    $result $this->db->sql_query($sql);
                }
            }
            
            
    $sql "SELECT * FROM " ONLINE_TABLE;
                
    $result $this->db->sql_query($sql);
            
             
    // Now I add a user
             
    $time time();
                if( 
    $this->get_db_stat('onlinecount') == )
                {
                        
    $sql "INSERT INTO " ONLINE_TABLE " (online_ip, online_time) VALUES ('$this->user_ip', '$time')";
                    
    $result $this->db->sql_query($sql);
            }
            else
            {
                while( 
    $row $this->db->sql_fetch_row($result) )
                {
                    if( 
    $this->user_ip == $row['online_ip'] )
                    {
                                    
    $sql "UPDATE " ONLINE_TABLE " SET online_time = '$time' WHERE online_ip='$this->user_ip'";
                                    
    $result $this->db->sql_query($sql);
                        return;
                    }
                }
                
                
    $sql "INSERT INTO " ONLINE_TABLE " (online_ip, online_time) VALUES ('$this->user_ip', '$time')";
                    
    $result $this->db->sql_query($sql);        
            }
        } 
    // End method online_function 
    La cultura è il nostro passaporto per il domani. Il futuro appartiene alle persone che si preparano oggi.
    Martin Luther King

  7. #7
    Utente di HTML.it L'avatar di Nix82
    Registrato dal
    Oct 2001
    residenza
    Mussolente (VI)
    Messaggi
    1,122
    Originariamente inviato da }gu|do[z]{®©
    sì sì.. poi ho risolto ciclando su tutto il risultato (ordinato per ip) e un "last ip" per scartare i doppioni.. in modo praticamente identico al codice del phpbb

    Pare fuzionare bene..

    mi chiedevo solo se c'era un modo pereliminare i doppioni direttamente in fase di query.. ma il distinct nno si può usare.. almeno non in una query normale... perchè gli altri campi sono sempre divers a parità di ip.. e quindi non risolvo nulla

    vabbè.. poco male...
    In realtà non avevo capito da cosa dipendeva il coteggio errato.. quando l'ho capito non è stato un problema risolvere

    :ciuaz:
    si appunto, resta sempre che non hai un valore con cui confrontarti... :guidoz:
    La cultura è il nostro passaporto per il domani. Il futuro appartiene alle persone che si preparano oggi.
    Martin Luther King

  8. #8
    Originariamente inviato da Nix82
    si appunto, resta sempre che non hai un valore con cui confrontarti... :guidoz:
    che intendi?

  9. #9
    Utente di HTML.it L'avatar di Nix82
    Registrato dal
    Oct 2001
    residenza
    Mussolente (VI)
    Messaggi
    1,122
    Originariamente inviato da }gu|do[z]{®©
    che intendi?
    :maLOL: :maLOL:

    che non puoi mettere una condizione AND in una query se non hai il valore dal database con cui confrontarti. Ti tocca per forza usare quel metodo. Ne ho studiate parecchie di classi on line e utilizzano sempre questa via.

    :RI-guidoz:
    La cultura è il nostro passaporto per il domani. Il futuro appartiene alle persone che si preparano oggi.
    Martin Luther King

  10. #10
    Originariamente inviato da Nix82
    :maLOL: :maLOL:

    che non puoi mettere una condizione AND in una query se non hai il valore dal database con cui confrontarti. Ti tocca per forza usare quel metodo. Ne ho studiate parecchie di classi on line e utilizzano sempre questa via.

    :RI-guidoz:
    ah.. ma aprlavi ancora della query ipotetica!

    e spiegati meglio.. credevo dicessi che c'era qualcosa che sbagliavo ORA...

    ma baff.......

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.