2012-03-20 18 views
5

Nel mio progetto, ho una classe wrapper per $_SESSION, quindi è possibile accedere alle variabili di sessione tramite $session->var. Stavo cercando di verificare se sono stati fissati variabili di sessione o non utilizzo di isset:

if (!isset($this->session->idUser)) { 
    ... 
} 

ma isset non restituisce nulla. Quindi nella mia classe di wrapper ho scritto la seguente funzione per testare cosa stava succedendo.

public function isItSet($var) 
{ 
    die(isset($_SESSION["id"])); 
} 

restituisce una pagina vuota. Ho provato:

public function isItSet($var) 
{ 
    die(is_null(isset($_SESSION["id"]))); 
} 

ancora una pagina vuota. Poi ho provato:

public function isItSet($var) 
{ 
    die(isset($_SESSION)); 
} 

Questo restituisce 1.

Qualcuno può dirmi perché si cerca di verificare se una variabile di sessione è impostata restituisce nulla?

+0

Ti ricordi session_start(); ? Anche se potrebbe sembrare banale, dovresti assicurarti. – Repox

+0

Sì, la sessione è iniziata nel costruttore di una classe genitore. die (session_id) restituisce una stringa come previsto. – Jormundir

+2

Usa 'var_dump' invece di' die' o 'echo'. In PHP un 'falso' booleano che viene convertito in stringa (nel tuo caso per l'output) verrà convertito in una stringa vuota. 'var_dump' ti mostrerà il valore e il tipo effettivi. Questo è solo PHP di base, per prima cosa mettiti a tuo agio con la lingua. – hakre

risposta

8

Per supportare isset() è necessario sovraccaricare la funzione nel proprio wrapper.

Così, nel vostro involucro, aggiungere:

public function __isset($var){ 
    return isset($_SESSION[$var]); 
} 

Per usarlo, basta fare:

isset($this->session->myVar); 

Se ancora non funziona, fai:

var_dump($_SESSION) 

Questo eseguirà il dump dell'intero array $ _SESSION e mostrerà se la variabile che si sta verificando esiste effettivamente.

+0

public function __isset ($ var) { return isset ($ _ SESSION [$ var]); } \t \t funzione pubblica isItSet ($ var) { die (isset ($ _ SESSION [$ var])); } Grazie per la risposta rapida, ma sto ancora avendo lo stesso problema con il codice di cui sopra. Ho anche provato isset ($ this-> session-> idUser) – Jormundir

+0

È possibile rimuovere la funzione 'isItSet()' in quanto non è di alcun uso. Ho anche aggiornato la mia risposta. – F21

+0

isset ($ this-> session-> var) non restituisce ancora nulla. Mi sono liberato di isItSet(). var_dump mostra che $ _SESSION è una matrice vuota. (Quale è previsto, quindi non dovrebbe il falso restituire falso?) – Jormundir

0

La funzione isset: restituisce TRUE se var esiste e ha valore diverso da NULL, altrimenti FALSE. se la variabile di sessione è impostata dà TRUE se la variabile di sessione è stata disattivata e dà FALSE.

Esempio:

$_SESSION['views']=1; variabile di sessione è impostato. => restituisce TRUE

unset($_SESSION['views']); la variabile di sessione non è impostata. => dopo questo if(isset($_SESSION[$var])) dà FALSE

Ci sono due opzioni: la variabile di sessione è impostata o meno.

isset() funziona solo con le variabili, in quanto il passaggio di qualsiasi altra operazione genera un errore di analisi. Per verificare se le costanti sono impostate, utilizzare la funzione defined().

For More Information about isset click here

1

isset restituisce una pagina vuota, perché la variabile non esiste in sessione, quindi Isset restituire false, tuttavia, eco falso di ritorno ''.
era già scritto nel commento alla hakre

È possibile verificare questo genere:

echo "false : " . false . "\n"; 
echo "true : " . true . "\n"; 

=>

false : 
true : 1 

Così, per il test, fare un var_dump($_SESSION) e vedrete se è normale che isset($_SESSION['id']) restituisca false.

È possibile anche prova: die("false : " . (false == isset($_SESSION['id'])));

0

Un paio di cose che si potrebbe provare:

Aggiungi questo al tuo codebase: http://philsturgeon.co.uk/blog/2010/09/power-dump-php-applications. È molto meglio di var_dump ed è possibile vedere chiaramente true o false per valori booleani. Mi ha salvato molto dolore.

In secondo luogo, die() non sempre mi dà quello che mi aspettavo, quindi è meglio echo qualcosa e poi die() subito dopo.

Come @ doydoy44 menzionato, false restituisce uno spazio vuoto, quindi potresti avere una pagina vuota per una buona ragione. Ancora una volta, il link sopra risolverà questo problema e renderà le cose più chiare.

Il codice originale sopra è idUser come la variabile da controllare, tutti gli altri esempi utilizzano id. Immagino che tu lo sappia, ma ho pensato di dirlo per ogni evenienza.

Infine, vorrei verificare che lo wrapper di sessione funzionasse come previsto, ad es.

if (!isset($this->session->idUser)) { 
    dump($_SESSION); 
    dump($this->session); 
} 

Ovviamente mi aspetto di ottenere lo stesso contenuto da entrambi.

La speranza aiuta un po '.

3

A mio parere, il problema è relativo al test e non alla sessione PHP.

Il ragione principale dietro perché variabile di sessione isset non restituisce nulla è l'uso di die() funzione che è equivalente per uscire() in base al manuale di PHP stesso.

http://in1.php.net/die

Quindi, uso var_dump() invece.

0

Sembra che non ci sia alcun tasto "ID" nell'array di sessione. Questo è stato verificato sul tuo commento alla risposta di F21 ("errore indice non definito").

Quello che si può fare è definire/inizializzare un tasto "ID" sull'array di sessione con valore come stringa vuota o vuota "" dopo l'avvio della sessione. Quindi compila il tuo valore in un secondo momento con i tuoi codici.

Questo per fare in modo che quando si utilizza isset ($ _ SESSION [ "ID"], il risultato può essere sia vera o falsa, piuttosto che un errore di indice indefinito.

1

I risultati sono sostanzialmente corrette.

I valori booleani in corso pass per ogni funzione appena si confusi credo.

Heres un chiaro spiegazioni ciò che accade a ciascuno di vostra dichiarazione.

consente di ottenere uno per uno

// declaring this array as a set of session being passed as sample. 
$string = array('name'=>'kaii'); 

echo die(isset($string['id'])); // figure 1 
// step 
// isset($string) returns a value of false because of unexistent of an array with the name of id. 
// die(false) returns nothing because of the value being passed by isset is false. 
// result would be definitely empty 

echo die(is_null(isset($string['id']))); // figure 2 
// step 
// isset($string) returns a value of false because of unexistent of an array with the name of id. 
// is_null(false) returns a value of false because it only accepts NULL as its parameter value to return true. 
// die(false) returns nothing because of the value being passed by is_null is false. 
// result would be definitely empty 


echo die(isset($string)); //figure 3 
// step 
// isset($string) returns a value of true because of a $string variable is set and exist. 
// die(true) returns a value of 1 because of the value being passed is true which is equivalent to 1 . 
// result would be definitely return a value of 1. 

Nota: In generale, la sua dichiarazione è corretta solo è necessaria qualche giustificazione per sostenerlo.


aggiuntive:

print_r(), var_dump()

  • lo usano per controllare la sessione se ha un nome che youre cercando di dichiarato.

Una breve spiegazione:

isset()

  • restituisce un valore booleano di true o false

is_null()

  • accetta solo un valore di parametro NULL per restituire un valore booleano di true altrimenti va false.

die()

  • restituisce valore 1 per true e valore vuoto per false.

Motivi:

  • Un valore booleano TRUE viene convertito nella stringa "1". Boolean FALSE viene convertito in ""
0

Le variabili di sessione sono un po 'magiche. Meno magia che storicamente, ma non sorprende che si osservino cose insolite.

Avrebbe senso eseguire i test nella domanda in tre stati: una volta con la variabile di sessione impostata e due volte senza la variabile di sessione impostata, una volta con una diversa variabile di sessione impostata e una volta senza set di variabili di sessione.

Adattando la risposta di F21, per supportare isset() è necessario sovraccaricare la funzione nel proprio wrapper. Mentre lo fai puoi anche creare un isset che funzioni come ti aspetti.

Qualcosa sulla falsariga di quanto segue risolverà sia il 'falso invisibile' sia un problema con la rimozione dei valori di sessione.

public function __isset($var){ 
if (isset($_SESSION[$var]) && $_SESSION[$var]."">"") { 
    return true; 
} else { 
    return false; 
} 
}