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

    PHP e AJAX le sessioni php vengono cancellate dopo il refresh della pagina

    Salve a tutti , sto costruendo un'applicazione web utilizzando AJAX e PHP come base per la navigazione e interazzione sul sito.

    Il problema consiste nella cancellazione delle sessioni PHP una volta che avviene il refresh della pagina (il refresh della pagina deve essere fatto manualmente non avviene in automatico).
    Più precisamente il problema si manifesta nel momento in cui vado a richiedere tramite AJAX due o più "parti di pagina" scritte in php e faccio il refresh della pagina , a questo punto accade che tutte le sessioni PHP create al momento del login vengono cancellate e nel mio caso con il conseguente logout dall'applicazione. Il problema si verifica soltanto quando vado a caricare tramite javascrip (non Jquery) e comandi AJAX due o piu risorse php mentre se ne carico solo una le sessioni rimangono stabili al refresh della pagina.

    Come base Javascrip AJAX per caricare le risorse uso il seguente medoto descritto anche al seguente link

    https://www.w3schools.com/js/tryit.a...s_ajax_xmlhttp
    codice:
    function loadDoc() {
      var xhttp = new XMLHttpRequest();
      xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
          document.getElementById("demo").innerHTML = this.responseText;
          callback_delle_mie_funzioni();
          seconda_richiesta_ajax_per_php();
        }
      };
      xhttp.open("POST", "la_mia_risorsa.php", true);
      xhttp.send();
    }
    Le Parti di pagina in PHP vengono richieste essenzialmente tramite il codice riportato sopra, la seconda richiesta AJAX per la seconda parte da caricare in PHP viene caricata tramite il callback della funzione principale.

    Il tutto funziona e con questo metodo ho caricato nella pagina le mie due risorse in php che rappresentano: la prima una pagina dal contenuto dinamico e la seconda una chat ed entrambe funzionano perfettamente le sessioni funzionano finche non faccio il refresh della pagina poi avviene reset di tutte le sessioni.

    Un problema simile lo avevo avuto in precedenza nello stesso progetto anche nel caricare una singola risorsa e anche in quel caso al refresh della pagina avveniva il reset delle sessioni php con il conseguente logout. La prima volta il problema l'ho risolto aggiungendo ad ogni risorsa php caricata la seguente funzione all'inzio di ogni pagina che veniva carica.
    Codice PHP:
    session_start() 
    Se ho capito correttamente session_start fa si che ogni sessione venga mantenuta o rigenarata al caricamento di una nuova risorsa php.

    Ora dopo vari tentantivi di risolvere il problema sono al punto di partenza, qualche consiglio?
    Ciao Grazie
    Valerio

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    191
    Si session_start() significa recupera (con altre impostazioni in php.ini "significa che può anche non essere verificato per ogni volta" o fallisce) o crea, se impostato un header https://www.php.net/manual/en/sessio...on.use-cookies la pagina dovrà essere priva di output.
    Inoltre dovrai impostare unicamente session_start() per scrip php non in ogni parte dei file inclusi.
    Ultima modifica di darbula; 21-02-2021 a 16:21

  3. #3
    Quote Originariamente inviata da darbula Visualizza il messaggio
    Si session_start() significa recupera (con altre impostazioni in php.ini "significa che può anche non essere verificato per ogni volta" o fallisce) o crea, se impostato un header https://www.php.net/manual/en/sessio...on.use-cookies la pagina dovrà essere priva di output.
    Inoltre dovrai impostare unicamente session_start() per scrip php non in ogni parte dei file inclusi.
    Ciao Grazie per la risposta , al momento session_start() è presente solo nei file che in qualche modo interagiscono con il file funzioni principale , negli altri casi non è presente.

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    191
    Ciao perdona l'attesa.
    La prima pagina visualizza dal cliente contiene a sua volta session_start()? Se no dovrai aggiungere session_start() se la sessione non esiste verrà creata altrimenti recuperata (non necessariamente con il refresh ma anche chiudendo la pagina e riaprirla nell'arco temporale della validità di sessione ovviamente se la sessione non è impostata alla chiusura della pagina o se impostato il cookie id dovrà essere presente).
    Sei sicuro necessiti di due richieste POST, non puoi ridurla a uno? Generalmente POST va usato per scambio di dati (login o comunque interscambio molti bytes).
    Scusa ciò che mi viene in mente è che le richieste POST non sono cacheabili e di conseguenza senza l'interazione del cliente (il cookie id ulteriori info cookie id) il server con php non può fare nulla.
    Nella prima pagina farei un tentativo in questo modo.
    Codice PHP:
    if(session_start()) {
    $_SESSION['user'] = 'test';
    //Altro codice compreso html
    } else {
    echo 
    'sessione fallita';
    }


    //Se le altre pagine dipendono dalla prima
    //per comodità supponi sia il codice di pagina 2
    if(session_start()) {
    if(!isset(
    $_SESSION['user'])) {
    echo 
    'errore nella richiesta';
    } else {
    if(
    $_SESSION['user'] == 'test') {
    echo 
    'sono il test, quando diverso dovrei avere valore diverso da test';
    }
    }
    } else {
    echo 
    'sessione fallita';

    Ultima modifica di darbula; 22-02-2021 a 15:50

  5. #5
    Quote Originariamente inviata da darbula Visualizza il messaggio
    Ciao perdona l'attesa.
    La prima pagina visualizza dal cliente contiene a sua volta session_start()? Se no dovrai aggiungere session_start() se la sessione non esiste verr� creata altrimenti recuperata (non necessariamente con il refresh ma anche chiudendo la pagina e riaprirla nell'arco temporale della validit� di sessione ovviamente se la sessione non � impostata alla chiusura della pagina).
    Sei sicuro necessiti di due richieste POST, non puoi ridurla a uno? Generalmente POST va usato per scambio di dati (login o comunque interscambio molti bytes).
    Scusa ci� che mi viene in mente � che le richieste POST non sono cacheabili e di conseguenza senza l'interazione del cliente (il cookie id) il server con php non pu� fare nulla.
    Grazie per la risposta,
    La prima pagina � sempre la stessa che � index.php e qui � presente sia session_start che session_regenerate_id(true);.
    Dalla home (index.php) si pu� accedere o registrarsi e in caso di login positivo viene caricata l'area utente e durante la procedura di login vengono create le sessioni php necessarie al funzionamento .
    Praticamente tutte le richieste ajax di caricare parti di pagina sono singole e tutto funziona anche con il refresh pagina tramite una procedura per lo "storage" delle sessioni php variabili con il seguente metodo

    codice:
    if(isset($_POST['id_video']){
        $idVideo=$_POST['id_video'];
        $_SESSION['id_video_s']=$_POST['id_video'];//Salvo la nuova sessione con l'ID interessato
    }
    else{
    // se invece facendo il refresh della pagina i dati in "POST" non sono pi� disponibili l'ID video viene ottenuto tramite la sessione impostata la prima volta.
    $idVideo=$_SESSION['id_video_s'];
    }
    $query="SELECT * FROM video WHERE id=$idVideo";
    // tramite il mio id in questo esempio solo video (ma in realta sono tre sessioni php varibili che mi servono per il corretto funzionamento) creo le query per l'interazione con il db.
    Per resettare le sessioni php varibili uso
    codice:
    $_SESSION['id_video_s']=null;
    come camando richiamato tramite la richiesta ajax di una pagina diversa da quella del video con script php che ne azzera il valore.

    Per il punto in cui mi chiedi se � necessario per forza utilizzare due richieste contemporanee purtroppo temo di si e mi spiego.
    La pagina problematica in questione dovrebbe caricare con la doppia richiesta prima la pagina principale dove verr� visualizzato il video in streaming di un evento e poi all'interno di quest'ultima un "modulo" per una chat che per la ricezione dei messaggi sfrutta una richiesta ajax php che avviene ogni 2 secondi .
    Se entrambi , il video e la chat, si trovassero nello stesso file e quindi in unica richiesta ajax php la richiesta di aggiornamento della chat andrebbe ad interrompere il flusso streaming e quindi comprometterebbe il servizio.

    Ciao Spero di essere riuscito a spiegarmi grazie.

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    191
    Ciao l'argomento è vasto varia di versione php e anche se usi moduli aggiornati o meno.
    Non puoi mescolare header (cookie di sessione) e output semmai solo header e niente output, oppure può darsi session_regenerate_id(true) non va bene per connessioni instabili, o probabilmente il file di sessione per qualche motivo è vuoto (dovresti controllare se hai accesso dove salvi i file) o per richieste simultanee (o comunque quasi parallele) dovresti usare session_write_close().
    Ecco qui un un'esempio di destroyed che non può superare 300 secondi altrimenti crea il fantasma (ghost) dovrebbe lavorare a ogni tuo caso (dovrebbe essere perfezionato il ghost ma al momento non avuto tempo di lavorarci).
    Se usi files come modulo dovrebbe essere compatibile da php 5.4 ad attuale altrimenti da php 7.1 il ps module imposta il corrente session status altrimenti dipende dal modulo in uso.
    Ho anche inserito il flock in lettura codice e funziona da creazione o aggiornamento sessione con il medesimo id.
    Quindi per qualsiasi pagina inserisci quel codice invece del semplice session_start (sto utilizzando la modalità rigorosa della sessione e non uso session_regenerate_id).
    Mentre nella seconda pagina
    Codice PHP:
    //se pagina di login creo $_SESSION['userid']
    if($ghost) {
    //connessione fantasma
    } else {
    session_start();
    $myapp_dstr $_SESSION['destroyed'];
    if(isset(
    $_SESSION['userid'])) {
    $myapp_user $_SESSION['userid'];
    }
    //dovrai usare session_write_close();
    //poi dovresti eliminare $_SESSION['userid'] se presente anche $_SESSION['userid']
    //in questo esempio non elimino ma mostro
    var_dump($_SESSION['destroyed']);
    }
    //al termine dello script avrò comunque session_write_close() implicito. 
    Giustamente la pagina di login dovrà creare l'userid inerente alla variabile $_SESSION.
    ob_start() dovrebbe trattenere l'output ma non so se funzioni anche per il core php si sto parlando del session.c del github.
    Nota qui spengo zlib ma se il cliente (browser) invia l'header gzip si aspetta output gzip, generalmente se si può abilitare zlib significa che si può modificare il php.ini (l'utente dovrebbe farlo).
    impostare la variabile a null o unset la prima forma libera Garbage Collector di php mentre la seconda elimina il valore dalla tabella mentre sarà php a decidere quando liberare memoria.

    https://3v4l.org/FfMUv
    Già che ci sei usa Google per impostare il tuo browser in UTF-8 e vedrai anche gli accenti al posto di simboli.

    Note forse non inerenti al tuo problema ma stile di buona codifica.
    Da php 7.1 non è possibile inizializzare $_SESSION se la sessione non è attiva (nel mio codice inizializzo se attiva).
    Da php 5.5 esiste session.use_strict_mode
    Da php 5.4 esiste session_status.
    In realtà va usato una volta per pagina e avrà effetto di creare o aggiornare la sessione ma senza $_SESSION leggibili, per il momento prendi dimestichezza con il codice poi si pensa.
    Ultima modifica di darbula; 12-03-2021 a 04:16

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.