2009-03-19 15 views
7

Non riesco a utilizzare le variabili di sessione su una pagina diversa da quella in cui sono impostate, IOW agisce come variabili non di sessione. Ho trovato una domanda simile pubblicata in una mezza dozzina di altri forum simili, ma la risposta in questi altri casi risulta sempre non applicabile.Variabili di sessione PHP non conservate

Qui sono i miei file:

sess1.php

<?php 
session_start(); 

session_register("userid"); 
session_register("textvar"); 

$_SESSION['userid'] = 10333 ; 
$_SESSION['textvar'] = TextVariable ; 

echo "<p>User ID is: " . $_SESSION['userid'] . "</p>" ; 
echo "<p>Another variable is: " . $_SESSION['textvar'] . "</p>" ; 
?> 
<p>Go to the <a href="sess2.php">next page</a>.</p> 

e, sess2.php

<?php 
session_start(); 

echo "<p>The userid session variable is: " . $_SESSION['userid'] . "</p>"; 
echo "<p>The other session variable is: " . $_SESSION['newvar']. "</p> "; 
?> 

L'uscita del browser in ogni caso è:

sess1.php

ID Utente: 10333

Un'altra variabile è: textvariable

Vai alla [pagina successiva].

e, sess2.php

La variabile di sessione userid è:

L'altra variabile di sessione è:

Vai alla [ultima pagina].

Un paio di cose non è così:

  • devo session_start() nella parte superiore di entrambi i file.
  • La directory delle variabili è scrivibile e le variabili di sessione vengono visualizzate lì. (Ho circa un centinaio di piccoli file chiamati sess_b62, che hanno questo all'interno: 'userid | i: 10333; textvar | s: 12: "TextVariable";'.)
  • phpinfo() mi dice che il file php.ini viene letto correttamente e la durata è impostata sul valore predefinito, 0, cioè fino alla chiusura del browser.

Sono alla fine del mio spirito. Eventuali suggerimenti?

Grazie mille.

+0

Hai controllato se viene utilizzato lo stesso ID di sessione? – Gumbo

+0

Una delle pagine è su SSL? –

+0

Quale versione di PHP stai usando? (anche da phpinfo()) –

risposta

2

L'ID di sessione deve essere trasportato in qualche modo in modo che la stessa sessione possa essere utilizzata su più pagine. In generale questo viene fatto con un cookie (vedere session.use_cookies) ma può anche essere fatto nell'URL o nei moduli (vedere session.use_trans_sid).

Quindi per prima cosa è necessario assicurarsi che l'ID di sessione venga trasmesso in modo che PHP possa caricare i dati di sessione e sessione giusti.

Vedi anche Is my understanding of PHP sessions correct?

+0

Grazie per l'aiuto. phpinfo() sembrerebbe confermare che sto utilizzando i cookie e che l'ID viene trasmesso. session.use_cookies è "On" e session.use_trans_sid è 0. Set-Cookie registra il cookie che è stato creato dalla prima pagina e quella pagina è nominata come il referente. –

+0

E l'ID di sessione è lo stesso su entrambe le pagine?L'invio di un campo di intestazione Set-Cookie non significa che il cookie sia stato accettato e inviato insieme alla seconda richiesta. Prova a confrontare i valori di ritorno 'session_id()' in entrambe le pagine. – Gumbo

+0

Crud. Gli ID di sessione sono diversi. Ora cosa ...? –

7

session_register() non è richiesto e potrebbe causare un problema qui. Leggi i documenti su session_register() - si intende assegnare le variabili di sessione usando le variabili esistenti.

e da here:

Beh, session_register() dice PHP che una certa variabile globale deve essere considerata una variabile di sessione.Ciò significa che al termine dell'esecuzione dello script (ovvero quando si verificano di solito le scritture dei dati di sessione), il valore risultante di tale variabile globale verrà scritto utilizzando i gestori di sessione abilitati correnti.

Penso che questo sia il problema che stai vivendo. Alla fine dell'esecuzione dello script la variabile di sessione viene sovrascritta.

+0

Sì, session_register() è stato deprecato per un po 'di tempo, sicuramente non dovrebbe più essere usato. Non so se sta causando questo problema specifico, ma non dovrebbe essere in quel codice a prescindere. –

+0

Interessante. Sto lavorando da un libro PHP/SQL introduttivo che è copyright '07, e il codice è praticamente una citazione diretta. Sfortunatamente, la rimozione delle righe session_register() non sembra risolvere il problema. Grazie mille per l'informazione. –

0

Utilizzare un qualche tipo di strumento e controllare le intestazioni http in modo da poter vedere come viene inviato il cookie. Forse il tuo server web è configurato male e invia i cookie con un dominio diverso non valido.

Si potrebbe voler guardare session_set_cookie_params() su ogni richiesta e assicurarsi che il dominio, il percorso e così via siano impostati.

-1

Utilizzare session_register in entrambi i file e dovrebbe funzionare.

+0

Grazie per il suggerimento. Ho provato in entrambi i modi, con le linee session_register() in entrambi i file e senza. Nessuna modifica al comportamento è apparsa. –

+0

session_register è deprecato: non usarlo se puoi evitarlo – rhodesjason

+0

@Jason: cura di condividere qualche URL dove dice che è deprecato? Cosa dovrebbe invece essere usato? –

2

Un errore che vedo è che nel primo file si imposta $_SESSION['textvar'] e nel secondo file si chiama $_SESSION['newvar'].

Inoltre, ho testato il codice su un server che so funziona e ha funzionato benissimo oltre l'errore sopra riportato.

Ho anche provato a rimuovere il session_register() e il codice funziona ancora perfettamente.

+0

Good eye - "newvar" era un refuso, rimasto da quando ho copiato il codice in nuovi file più semplici. Ma la soluzione session_register() non funziona sul mio sistema. Grazie mille per il suggerimento. –

+0

Hai provato a cancellare i cookie (o eliminare i cookie di questi siti) e ad accedere a questa pagina come prima pagina di nuovo accesso? Inoltre, sei sicuro che non ci sia altro testo sopra o il

1

"session_register() accetta un numero variabile di argomenti, ognuno dei quali può essere sia una stringa tiene il nome di una variabile o una matrice consistente di nomi di variabili o altri array. Per ogni nome, session_register() registra la variabile globale con quel nome nella sessione corrente. "

perché non ci sono variabili con questi nomi, il risultato sarà imprevedibile.

basta usare $_SESSION[$key] = $value;

1

Se tutto quanto sopra non risolve il problema, I'll basta chiedere l'ovvio: Ci essere avrebbe't spazi o nuove linee prima del tag di apertura php?

È anche possibile controllare i messaggi nel file di registro degli errori del server, che dovrebbe indicare se le variabili sono definite (anche se suppongo che dipenda anche dal livello di segnalazione degli errori).

0

Un'altra cosa ovvia da controllare:

Assicurarsi che lo spazio su disco non è pieno; che impedirebbe il salvataggio dei dati della sessione.

0

Sapere che questo è un post più vecchio ma ho avuto un problema simile (non utilizzando session_register()).

Doveva convertire le sessioni in cookie perché la sessione stava scadendo troppo spesso e, a causa della configurazione del server ('speciale' ambiente di hosting del server Windows (con Apache)), il valore di timeout della sessione PHP non poteva essere modificato .

Il risultato finale era/è che ora dopo la conversione in cookie con durata estesa, i dati dei cookie sono ancora andati persi (in trasmissione)? a volte.

Molto frustrante.

NON mi è MAI mai successo in un ambiente LAMP, quindi forse la domanda da porsi è se si sta utilizzando o meno un server LAMP.

Spero che questo aiuti. Non penso che questo sia un problema di PHP.

3

Mi trovavo di fronte allo stesso problema. Il motivo era, in php.ini ho impostato il valore di session.cookie_secure parametro a . Ma stavo usando http invece di https nell'URL. L'uso di https ha risolto il problema.

Impostazione session.cookie_secure = 1 indica che i cookie devono essere inviati solo tramite connessioni sicure. Pertanto, stavo ricevendo nuovi session_ids su ogni nuova pagina durante l'utilizzo di http.

0

Controllare i registri del server del server PHP, ad esempio nginx o apache.

È possibile trovare informazioni sul perché le sessioni non funzionano in nginx error.log. Il percorso del file in genere è: /var/log/nginx/error.log.

Nel mio caso stava dicendo che i dati di sessione non possono essere salvati. Si è scoperto che nella stessa directory il vecchio file error.log.1 aveva una dimensione di 17 GB e occupava tutto lo spazio disponibile su disco.

Semplicemente liberando spazio su disco ripristinato il normale comportamento delle sessioni.

Problemi correlati