Visualizzazione dei risultati da 1 a 5 su 5
  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
    58
    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
    58
    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.

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