Visualizzazione risultati 1 fino 9 di 9

Discussione: Errore con le sessioni

  1. #1
    kairos2020 non è connesso Utente giovane
    Data registrazione
    16-04-2020
    Residenza
    Castegnato (BS)
    Messaggi
    47

    Predefinito Errore con le sessioni

    Buonasera, ho un problema davvero strano con le sessioni.
    In un file ( gen_ctr.php) setto il valore di alcune variabili di sessione poi lo stesso file chiama
    un secondo (azi_grd.prd) file il quale in base al valore della variabile passata esegue operazioni
    diverse.

    Quando cerco di leggere questi valori in azi_grd.php ricevo un messaggio di Undefined index: ses_co1 ...
    ho provato con un ciclo a leggere le variabili di sessione
    Codice PHP:
    foreach ($_SESSION as $key=>$val)
    { echo
    $key. $val ; }
    Notice: Undefined index: ses_co1 in /membri/kairos2020/php/azi_grd.php on line 20
    Notice: Undefined variable: cod in /membri/kairos2020/php/azi_grd.php on line 36
    Notice: Undefined index: ses_co1 in /membri/kairos2020/php/azi_grd.php on line 37
    Notice: Undefined index: ses_rpa in /membri/kairos2020/php/azi_grd.php on line 41

    Nessuna variabile di sessione settata, infatti isset(nome-indice) torna sempre falso.

    Naturalmente ho provato a controllare lo status della sessione
    Codice PHP:
    if(session_status() !== PHP_SESSION_ACTIVE) { die "Sessione morta";}
    else { die(
    "Sessione attiva");}
    Sempre sessione attiva...


    Aggiungo che in locale tutto funziona correttamente e su due siti diversi dove uso lo stesso
    sistema non ho alcun problema, uno dei siti è ospitato su altervista e l'altro su aruba...

    Non credo abbia importanza, ma la versione php di sviluppo è la 7.4 mentre ho controllato che altervista
    utilizza la 7.3.

    Certamente si tratta di un mio errore madornale, ma dopo tre ore di tentativi inutili, giusto
    prima di rivolgermi ad un esorcista...

    Se qualcuno ha qualche idea gli sarei davvero grato.

    Grazie per la cortese attenzione.

  2. #2
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    La sessione php è il modo per memorizzare tramite protocollo http poiché stateless.
    In php significa anche utilizzare i cookie e memorizzare su file, come anche altre scelte ma altervista supporta solo la prima.

    Puoi impostare error_reporting(-1); al primo file php caricato?
    Comunque stai effettuando output prima di creare un Set-Cookie: value e Cookie: value
    Adesso ti spiego la differenza tra variabile e recuperare un valore precedentemente memorizzato.
    primo_file.php
    Codice PHP:
    <?php
    error_reporting
    (-1);
    if(
    session_start()) { // php >= 7.1 return true
    $_SESSION['crea_recupero'] = 'value';
    // php internamente crea header Set-Cookie: id
    }

    //chiudo l'interprete php
    ?>
    Nella pagina attuale esiste $_SESSION['crea_recupero'] mentre per usi successivi verrà conservato in un file temporaneo da un id cookie, in php dalla prossima richiesta http tramite funzione session_start(); e il id cookie recuperi il precedente dato memorizzato.
    Spiegato creazione variabile e memorizzare con recupero per usi successivi.

    Se il browser invia il id cookie (creato automaticamente Set-Cookie del primo file) secondo_file.php
    Codice PHP:
    <?php
    if(session_start()) {
    // esiste $_SESSION['crea_recupero'] generato dal file temporaneo e id cookie
    }
    ?>
    Ultima modifica di darbula : 03-03-2023 alle ore 15.07.40

  3. #3
    kairos2020 non è connesso Utente giovane
    Data registrazione
    16-04-2020
    Residenza
    Castegnato (BS)
    Messaggi
    47

    Predefinito

    Buongiorno,
    grazie per la cortese e sollecita risposta.
    Che PHP sia stateless (purtroppo) mi è chiaro, ci ho sbattuto immediatamente il naso cercando di fare il porting in questo linguaggio di una applicazione aziendale dhe avevo realizzato in VB/SQL.

    All'inizio di ogni file includo un file con tutti i settaggi e le funzioni base ( reminescenza VB) la prime righe
    sono le seguenti :
    Codice PHP:
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);


    define("DEBUG_MODE",true);
    date_default_timezone_set('Europe/Rome');
    if (
    DEBUG_MODE) { error_reporting(E_ALL);} else {error_reporting(0);}
    Cambio DEBUG_MODE = false quando finisco i test.
    In effetti sul sito errori e notice sono chiaramente indicati infatti viene visualizzato :
    Codice PHP:
    Undefined index: ses_co1 in /membri/kairos2020/php/azi_grd.php on line 20
    Inizialmente utilizzavo i cookies, in questo progetto ne uso solo uno per gestire il pop della privacy, oltre
    naturalmente all'ID di sessione che viene creato automaticamente.
    Anche per il passaggio tra 'form' di flag (record cancellato etc.) utilizzo una variabile di sessione.

    Non son certo sia il modo migliore ma... funziona.

    Il tuo esempio è chiarissimo, il problema è che io faccio esattamente così.
    Ho uno il seguente script :
    Codice PHP:

    $form
    =filter_input(INPUT_GET, 'frt', FILTER_SANITIZE_NUMBER_INT);
    $cod=$_GET['cod'];
    // Se i ati non sono corretti invio a uno script che azzera tutte le variabili di sessione e invia a home
    // Cod è sanificato con una funzione perchè FILTER_SANITIZE_STRING è deprecato ... credo
    if(!ValidaInput($cod)) {header('Location: gen_rst.php?frt=1');exit;}
    if(!
    is_numeric($form)) {header('Location: gen_rst.php?frt=1');exit;}
    if(
    $form== 1) {

    $_SESSION['ses_frm']="azi_grd.php"; $_SESSION['ses_tab']='aziende';
    $_SESSION['ses_ord']='aziAzi ASC'; $_SESSION['ses_pag']=1;$_SESSION['ses_rpa']=15;
    $_SESSION['ses_co1']=$cod;}
    //

    if($_SESSION['ses_frm']=="") {header("Location: gen_err.php?num=99&frt=1&tipo=1");exit;}
    // Se non $_SESSION['ses_frm'] non è, per qualsiasi ragione definito registro l'errore, resetto e torna a HOME
    // altrimenti carico lo script selezionato con le variabili di sessione qui creati
    $dove=$_SESSION['ses_frm'];header("Location: $dove");exit;
    In questo caso $dove corrisponde allo script azi_grd.php che al caricamento visualizza :
    Notice: Undefined index: ses_co1 in /membri/kairos2020/php/azi_grd.php on line 20
    Notice: Undefined variable: cod in /membri/kairos2020/php/azi_grd.php on line 36
    Notice: Undefined index: ses_co1 in /membri/kairos2020/php/azi_grd.php on line 37
    Notice: Undefined index: ses_rpa in /membri/kairos2020/php/azi_grd.php on line 41
    Notice: Undefined index: ses_pag in /membri/kairos2020/php/azi_grd.php on line 42
    Notice: Undefined index: ses_ord in /membri/kairos2020/php/azi_grd.php on line 43
    e questo warning dovuto al valore NULL di uan variabile di sessione
    Warning: Division by zero in /membri/kairos2020/php/azi_grd.php on line 46.

    ... All'inizio di ogni scrip includo la classe ClSysSecure della quale creo subito una istanza
    la classe ha il seguente __construct
    Codice PHP:
    public function __construct() {
    $this->cookie = [ 'lifetime' => 0,'path' => '/','domain' => '','secure' => true,
    'httponly' => true,'samesite' => 'lax'];
    $this->initSession();
    }
    private function
    initSession() {
    ini_set('session.use_cookies','1');
    ini_set('session.use_only_cookies','1');
    ini_set('session.use_trans_id','0');
    ini_set('session.use_strict_mode','1');
    session_set_cookie_params($this->cookie);
    $this->iniziaSessione();
    }
    Quindi di sicuro la sessione è aperta in ogni form, in ogni caso ho controllato utilizzando
    Codice PHP:

    if(session_status() !== PHP_SESSION_ACTIVE) { die "Sessione morta";}
    else { die(
    "Sessione attiva");}
    la risposta è sempre Sessione attiva.

    Sono senza dubbio un principiante, ho letto molti manuali sul linguaggio ( il mio prof. di fisica sosteneva invero che studiare e capire sono domini completamente diversi tra loro) e questo problema attiene all' ABC del PHP,
    è davvero frustante perchè dato per certo che il PHP funziona sono io che commetto un errore madornale (eufemismo)

    Mi scuso per la lunghezza .

    Grazie per la cortese e paziente attenzione.
    Ultima modifica di kairos2020 : 03-03-2023 alle ore 11.37.37

  4. #4
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Ciao buongiorno, il codice che proponi non è coerente al mio codice di esempio.
    Uso session_start() per creare o aggiornare nel primo file mentre nel secondo file per recuperare il valore precedentemente memorizzato poiché è una richiesta http.
    Se effettuo header Location: ma non utilizzo session_start() non avrò la variabile $_SESSION valorizzata.
    L'inoltro del modulo html genera una url simile a questa http://nomeutente.altervista.org/php/gen_ctr.php?frt=1&cod=1 il codice è valido solo se utilizzato come scritto nel tuo programma.
    Ultima modifica di darbula : 03-03-2023 alle ore 15.01.49

  5. #5
    kairos2020 non è connesso Utente giovane
    Data registrazione
    16-04-2020
    Residenza
    Castegnato (BS)
    Messaggi
    47

    Predefinito

    Buongiorno,
    chiedo scusa ma faccio fatica a capire, e per colpa mia.
    Provo a sintetizzare.
    In ogni file, al suo inizio, io apro una sessione, questo con file include, e credo che inserire session_start in un file include funzioni, anzi è così perchè, come scritto, se verifico con session_status() vedo che la sessione è attiva.

    Se effettuo header Location: ma non utilizzo session_start() non avrò la variabile $_SESSION valorizzata.
    Questa è la sequenza dei comandi :

    1° script
    Apro la sessione
    Leggo variabile con GET e con questa, ed altri valori, creo le variabili SESSION
    fatto questo uso header Location per spostarmi al 2° file, nota che in header uso un valore preso da una variabile
    di sessione.

    Secondo script
    Qui apro la sessione
    Leggo i valori delle variabili di sessione e ... queste non sono settate (NULL).

    Le sessioni sono attive sia nel 1° sia nel 2° script ma nel secondo le variabili sessione del 1° non ci sono.

    Per il (poco) che conosco di PHP questo è strano, davvero strano...peraltro non ho la benchè minima idea del
    problema mi pare che tutto sia corretto.

    Se poi considero che in locale e in altri due siti, di provider diversi, funziona ... non credo alla stregoneria ma...

    Sono sicuro al 100% che ho commesso una castroneria incredibile ma non riesco a capire dove.
    Riscrivo tutto da zero e speriamo, vengo da Windows dove spegnere e riaccendere spesso era taumaturgico.

    Grazie per la pazienza e la cortese attenzione.

  6. #6
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,259

    Predefinito

    Può essere che il problema non sia nel PHP. Controlla ad esempio se...

    - le due pagine sono sullo stesso dominio? (la sessione si appoggia ad un cookie, ed il cookie al dominio)
    - hai qualche plug-in del browser che potrebbe rifiutare o cancellare cookie?
    - HTTP / HTTPS?

  7. #7
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Il parametro secure indica connessione https, dal pannello di controllo abilita https e poi effettua la richiesta http tramite https.

  8. #8
    kairos2020 non è connesso Utente giovane
    Data registrazione
    16-04-2020
    Residenza
    Castegnato (BS)
    Messaggi
    47

    Predefinito

    Buonasera,
    grazie per la risposta.
    No, non uso plugin solo codice scritto da me ed il dominio è unico e fa riferimento all'indirizzo www.kairos-20202.altervista.org

    Anche io, pur nei limiti delle mia scarsa conoscenza del linguaggio ho seri dubbi che la causa sia nel codice
    php, a parte differenza di versione ( 7.3. / 7.4) il codice è talmente semplice che un errore, per quanto possibile è improbabile.
    Peraltro funziona in locale ( magari poco significativo ) e sicuramenet su almeno un'altro sito di diverso provider,
    ma più probabilmente si due.

    Non ho alcuna idea circa il funzionamento del server o di htpaccess etc. ma ...

    In ogni caso ho appena registrato un sito a pagamento giusto per fare un'ultima prova, perchè se l'errore è davvero nel mio codice PHP è un segnale inequivocabile che è giunta l'ora di passare ad hobby più adatto agricoltura o cucito.

    Grazie per l'eccellente supporto ricevuto.

    p.s. ho visto ora l'utlimo suggerimento provvedo e riporto il risultato.
    Ultima modifica di kairos2020 : 03-03-2023 alle ore 19.35.07

  9. #9
    kairos2020 non è connesso Utente giovane
    Data registrazione
    16-04-2020
    Residenza
    Castegnato (BS)
    Messaggi
    47

    Predefinito

    Buonasera,GRAZIE!!!
    In attesa dell'attivazione del protocollo HTPPS ho provato a cambiare SECURE a false.
    Funziona correttamente.
    Grazie ancora per il supporto e la pazienza.

Regole di scrittura

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