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

    Application e Session che non vanno...

    Ragazzi sto impazzendo con un problema da diversi giorni.
    Cerco di spiegarvi il problema meglio che posso.

    Il programma riguarda una sistema di messaggeria.
    Dunque un utente fa il login:
    se è riconosciuto avviene questo:

    codice:
    	session("utente") = rsME("ID_utenti")
    	session.timeout = 20
    
    if InStr(1, Application("Users"), Session("utente") & "|" ) = 0 then  
    'se l'utente non è già presente   
    Application.Lock  
    'viene aggiunto l'utente appena loggato alla stringa che contiene  
    ' l'elenco degli utenti  
    Application("Users") = Application("Users") & Session("utente") & "|"  
    Application.UnLock 
    end if
    nel global.asa il codice è il seguente:

    codice:
    <SCRIPT language="VBScript" Runat="Server">  
    Sub Application_OnStart  
    Application("Users") = "" 
    End Sub 
    
    
    Sub Session_OnEnd 
    
    Application.Lock   
    Application("Users") = Replace( Application("Users") , Session("utente") & "|" ,"")   
    'quando scade una sessione viene eliminato il nome dell'utente dalla variabile di  
    'applicazione che contiene l'elenco degli utenti attivi   
    Application.UnLock 
    
    End Sub
    </SCRIPT>
    Quindi questo è il discorso relativo al riconoscimento degli utenti sul sito.
    Adesso c'è una pagina che si chiama messaggeria.asp che richiama con un iframe al suo interno la pagina inc_messaggeria.asp

    Questa pagina determina gli utenti che sono connessi

    codice:
     arrUtenti = Split(Application("Users"),"|") 
     for i = 0 to UBound(arrUtenti)  
      all_id = all_id & arrUtenti(i) & "," 
      next
      lunghezza = len(all_id)
      all_id = mid(all_id, 1, lunghezza-2)
    e dopo fa la query per visualizzare tutte le informazioni di cui ho bisogno:

    codice:
    strSQL = "SELECT tab_utenti.user_utente, tab_utenti.nome_utente, tab_utenti.ID_utenti, tab_utenti.sesso_utente, tab_utenti.foto_utente, tab_utenti.data_utente, tab_utenti.admin_utente, tab_utenti.online_utente, SUM(tab_messaggeria.id_mittente) AS somma_messaggi " &_
    			"FROM tab_utenti LEFT OUTER JOIN " &_
    			"tab_messaggeria ON tab_messaggeria.id_mittente = tab_utenti.ID_utenti " &_
    			"WHERE tab_utenti.ID_utenti IN ( " & All_ID & " ) AND tab_utenti.online_utente = 1 " &_
    			"GROUP BY tab_utenti.user_utente, tab_utenti.nome_utente, tab_utenti.ID_utenti, tab_utenti.sesso_utente, tab_utenti.foto_utente, tab_utenti.data_utente, tab_utenti.admin_utente, tab_utenti.online_utente"
    Questa pagina si refresha, attraverso un meta ogni 40 secondi.
    Se la session è scaduta c'è un controllo sopra alla pagina:

    codice:
    <%
    if session("utente") = "" then
    
    session("pagina") = "../messaggeria.asp"
    %>
    <script language="javascript">
    parent.location.href='/nologin.asp';
    </script>
    <%
    end if
    %>
    Purtroppo accade che dopo circa una decina di minuti, anche se non è scaduta la session, non mi mostra piu nessun utente nella pagina dove devo mostrare gli utenti connessi, e non mi fa neanche il login, semplicemente non mi mostra niente, come se la query non restituisse nessun valore valido.

    Lo so è un pò complesso, ma vi prego sto impazzendo e non capisco il perchè!!!
    Riuscite a darmi una mano?

    Grazie a tutti

  2. #2
    Moderatore di ASP e MS Server L'avatar di Roby_72
    Registrato dal
    Aug 2001
    Messaggi
    19,559
    Fatti stampare a video SEMPRE la query così ad ogni refresh ti rendi conto di cosa sta facendo e quindi, quando non va, cosa le manca.

    Roby

  3. #3
    Ciao Roby grazie per la risposta.

    Dunque ho notato che allo scadere della session è successo questo, ti riporto solo la parte di query interessante:

    codice:
    WHERE tab_utenti.ID_utenti IN ( 528253115447544 )
    Quindi in pratica ha eliminato le virgole che separavano gli ID degli utenti generando un unico numero...

    Penso che il problema sia legato a questa porzione di codice:

    codice:
    dim arrUtenti 
    'Response.Write "Utenti Collegati:
    " 
     arrUtenti = Split(Application("Users"),"|") 
     for i = 0 to UBound(arrUtenti)  
      all_id = all_id & arrUtenti(i) & "," 
      next
      lunghezza = len(all_id)
      all_id = mid(all_id, 1, lunghezza-2)
    che ho creato per avere gli ID degli utenti separati da virgola.

    Sai dirmi in cosa sbaglio?
    Grazie mille per l'aiuto

  4. #4
    Moderatore di ASP e MS Server L'avatar di Roby_72
    Registrato dal
    Aug 2001
    Messaggi
    19,559
    Sarà rimasto un solo utente... se scade la sessione toglie l'utente.

    Roby

  5. #5
    però quando accedo, e l'utente è uno solo lui mi stampa correttamente questo:

    WHERE tab_utenti.ID_utenti IN ( 5282 )

    mentre invece se sono due questo

    WHERE tab_utenti.ID_utenti IN ( 5282, 5283 )

    scadendo la session, ed eliminadomi quindi l'application relativa a quell'utente, non dovrebbe restituirmi correttamente di nuovo questo:

    WHERE tab_utenti.ID_utenti IN ( 5282 ) ??

    Grazie

  6. #6
    Moderatore di ASP e MS Server L'avatar di Roby_72
    Registrato dal
    Aug 2001
    Messaggi
    19,559
    Si, è la parte dentro le parentesi che devi analizzare.
    Sicuro sia quella di prima?

    Roby

  7. #7
    Dunque forse ho risolto.
    Ti spiego come ho impostato così magari puoi dirmi se vedi degli errori:

    codice:
    response.Write application("Users")
    ALL_ID_1 = replace(application("Users"), "|", ",")
    All_id = left(ALL_ID_1, Len(ALL_ID_1)-1)
    In pratica l'application mi restituisce sempre l'ID dell'utente collegato affiancato da |.
    Quindi ho fatto il replace dell | con la ,.

    Ma visto che per la query ho bisogno che l'ultima virgola non ci sia altrimenti mi dà errore ho calcolato la lunghezza della variabile che comprende le application e ne ho tolto l'ultimo carattere che dovrebbe essere sempre l'ultima virgola.

    Se per esempio ho un utente loggato ottengo questo:
    IN ( 5282 )
    due utenti invece
    IN ( 5282, 5283)
    e così via.

    Scadendo una session, in teoria dovrebbe eliminarmi un ID dall'application e quindi ritornare al valore
    IN ( 5282 )

    Che ne dici? Sembra corretto no?
    Grazie

  8. #8
    NO...come non detto!!!

    Allora il problema nasce quando scade la session.
    Quindi deve essere per forza nel file global.asa il problema.

    Inpratica quando scade la session mi unisce tutti gli id, questo infatti è il response.write della variabile application("users")

    5282528353115446
    e così la query diventa

    IN ( 528252835311544 )

    Perchè mi fa questo errore cavolo...
    Il global.asa è il seguente, forse è qui l'errore?

    codice:
     <SCRIPT language="VBScript" Runat="Server">  
    Sub Application_OnStart  
    Application("Users") = "" 
    End Sub 
    
    
    Sub Session_OnEnd 
    
    Application.Lock   
    Application("Users") = Replace( Application("Users") , Session("utente") & "|" ,"")   
    'quando scade una sessione viene eliminato il nome dell'utente dalla variabile di  
    'applicazione che contiene l'elenco degli utenti attivi   
    Application.UnLock 
    
    End Sub
    </SCRIPT>
    Spero in tuo aiuto
    grazie

  9. #9
    Scusate se mi uppo ma questo problema mi sta dando troppo sui nervi.

    Ho capito una ulteriore cosa.
    In pratica il problema non sorge quando scade la session, ma così in maniera random.
    Questo perchè la pagina in cui devo effettuare questi calcoli si aggiorna automaticamente con un META ogni 40 secondi, quindi in teoria la session non può mai cadere.

    Adesso lo stato testando ancora, con una session impostata a 20 minuti, ed ho visto che dopo circa 8 minuti il risultato è di nuovo quello:

    52825283

    cioè l'unione degli ID privati del delimitatore "|"

    perchè accade tutto ciò.....................
    Grazie come sempre

  10. #10
    allora ho fatto un test definitivo.
    Ho creato una pagina scemissima di questo tipo:

    codice:
    <meta http-equiv="refresh" content="40;URL=/mess_prova.asp" />
    <%
    response.Write application("Users")
    ALL_ID_1 = replace(application("Users"), "|", ",")
    All_id = left(ALL_ID_1, Len(ALL_ID_1)-1)
    %>
    Per circa 25 minuti mi ha stampato correttamente
    5282|5283|
    poi ad un tratto mi stampa questo:
    52825283

    Vi prego non so piu a quale santo votarmi...

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