Visualizzazione risultati 1 fino 8 di 8

Discussione: Chiarimento sulle Sessioni

  1. #1
    Guest

    Question Chiarimento sulle Sessioni

    Salve a tutti! Avrei bisogno di un piccolo chiarimento sulle sessioni di PHP.

    Ho letto che il codice session_start(); necessario per avviare una sessione e permettere di modificare le variabili $_SESSION di quella pagina, deve essere la PRIMA cosa presente nella pagina php. Ora, la mia domanda è, se la pagina in questione è "richiamata" da una funzione esterna (required od include) rende impossibile avviare sessioni, dato che la pagina annidata nella "principale" contiene già del codice? Altra domandina, io avvio una sessione al login, che lascio attiva fino al logout (ovviamente), ora avrei bisogno di avviarne (o di modificare la precedente) per gestire alcune "tempistiche" del forum interno del sito, posso tranquillamente avviare una nuova sessione interna alla precedente, o faccio casini? Mi espongo a rischi sulla sicurezza?

    Spero che sia tutto chiaro, ringrazio tutti per le risposte :D

  2. #2
    L'avatar di saitfainder
    saitfainder non è connesso Sëniör Stäff
    Data registrazione
    06-12-2002
    Residenza
    Torino
    Messaggi
    8,715

    Predefinito

    session_start non deve essere necessariamente la prima istruzione eseguita, l'importante è che prima di session_start non venga stampato qualcosa (particolarmente insidiosi sono dei ritorni a capo prima o dopo i tag <?php e ?>.

    Una sessione PHP consiste sostanzialmente da un cookie che contiene una stringa che viene utilizzata per caricare un insieme di dati salvati sul server. Se vuoi associare due insiemi di dati allo stesso utente certamente lo puoi fare.


    «È una mia peculiarità distorcere la verità e inventarne di nuove.»
    «I tuoi orientamenti hanno su di me un effetto prossimo allo zero.»


  3. #3
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,270

    Predefinito

    Il fatto che la session_start() debba essere la PRIMA istruzione è una cosa semplificata: anche io lo dico spesso, per far in modo che gli utenti non sbaglino. Per utenti un tantino più avanzati, la risposta sarebbe che va prima di qualsiasi output HTML. (quindi echo, die(), o codice html, o simili).

    Quindi, se includi altre pagine prima, devi assicurarti che queste non stampino nulla.

    Per le altre variabili, puoi benissimo aggiungere altri elementi nell'array $_SESSION[] tranquillamente. Non fai nessun casino e non rischi nulla

    Ciao!

    EDIT:

    a questo punto diciamola tutta: le funzioni che vanno a modificare l'header della pagina, devono essere eseguite prima di qualsiasi output HTML: una pagina HTML (o PHP) arriva al browser in 2 pezzi: la prima è l'header (che non ha nulla a che vedere con <head>), mentre la seconda è il corpo (dove c'é l'HTML {e quindi <head>, <body>....). Nell'header sono specificati molti parametri. Se invii dei dati del corpo della pagina, il browser che riceve i dati capisce che l'header è terminato, quindi inizia a "popolare" il corpo. Se poi vuoi ri-modificare i dati dell'header, non puoi più perché è già stato inviato.

    Le principali funzioni che soffrono di questo problema sono header(), setCookie(), session_start() {che usa i cookie}.
    Fortunatamente c'é un'ottima funzione, headers_sent() che dice se l'header è stato inviato. Quindi puoi fare anche una cosa del tipo:
    Codice PHP:
    if(header_sent())
    echo
    'Non posso invocare la session_start(), perché l\'header è già stato inviato!';
    else
    session_start();
    Infine, volendo, puoi anche bufferare l'output alla pagina con le funzioni ob_*
    Ultima modifica di alemoppo : 22-02-2013 alle ore 16.48.01 Motivo: anticipato... ma lascio :P

  4. #4
    Guest

    Predefinito

    Grazie ad entrambi della risposta, ho più o meno capito XD Nel mentre sono andato avanti ed ho fatto un esperimento. Senza mettere sessions_start(); ho potuto creare variabili di Sessione perfettamente funzionanti. Credo che ci sia nel CMS di base che sto usando (gdrcd5.1 ADVANCE) un sessions_start(); messo nel posto giusto che mi permetta tale modifica, o essendo la sessione non terminata (fino al logout) posso comunque scriverci dentro. Quindi il problema mi sono reso conto che non mi si pone. Dico bene? Le due evenienze che ho ipotizzato possono essere corrette?

    EDIT: se non fosse chiaro, oltre la voglia di imparare, ho il TERRORE di fare danno.
    Ultima modifica di morgensterngdr : 22-02-2013 alle ore 17.01.12

  5. #5
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,270

    Predefinito

    Per le due ipotesi: se c'é già una session_start(), e sotto ne scrivi un'altra, dovrebbe dare un warning dicendo che la sessione era già stata aperta. Se non utilizzi session_start(), $_SESSION {da quel che ricordo, quindi potrei sbagliarmi} dura come le altre variabili, ovvero se aggiorni la pagina dovrebbe resettarsi.

    Ciao!

  6. #6
    Guest

    Predefinito

    Mmmm, non mi da nessun warning che apro una nuova sessione. E le $_SESSION che ho impostato, perdurano... mi sa che fa così perché la Sessione non viene chiusa se non al logout, quindi posso lavorarci sopra tranquillamente.

  7. #7
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,270

    Predefinito

    Se non c'é alcuna session_start(), mi pare strano che la sessione viene recuperata:
    session_start() creates a session or resumes the current one based on a session identifier passed via a GET or POST request, or passed via a cookie.
    ...Altrimenti a che servirebbe la session_start()? .

    Ciao!

  8. #8
    Guest

    Predefinito

    Citazione Originalmente inviato da alemoppo Visualizza messaggio
    Se non c'é alcuna session_start(), mi pare strano che la sessione viene recuperata:

    ...Altrimenti a che servirebbe la session_start()? .

    Ciao!
    Allora non comprendo come sia possibile che funzioni tutti XD Smetto di chiedermelo e mi godo la cosa? XD

    EDIT: Trovato il session_start(); XD apposto! :D
    Ultima modifica di morgensterngdr : 22-02-2013 alle ore 22.53.17

Tags for this Thread

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •