Originariamente inviato da PaoDJ
Con register_globals settato ad On, tutte le variabili sono uguali.

Esempio: index.php?variabile=ciao

La condizione $_GET['variabile']==$_POST['variabile']==$_SESSION['variabile']==$_COOKIE['variabile']==$_SERVER['variabile']==$variabile
è vera

In breve, con register_globals ad On, tutte le array ($_SESSION,GET,COOKIE,POST,REQUEST,SERVER,ENV) contengono gli stessi valori

Un tempo si usavano le register globals ad on perchè era comodo, quando si passava un parametro via get (nell'esempio il parametro si chiama "variabile"), averlo già impostato in $NOMEVARIABILE (nell'esempio $variabile).

E' evidente che impostante $variabile='boh'; in uno script, anche $_GET['variabile'] conterrà "boh" e così via per tutte le altre array (GetPostCookieSessionEnv).

Sono, in breve, tutte uguali.

E' piu chiaro ora?


Non è affatto così.

Con register_globals a ON il contenuto degli array superglobali viene automaticamente registrato nelle variabili globali, e solo ad inizio script. Non avviene il processo contrario.

Quindi: pagina.php?id=2, con register_globals a on, produrrà la seguente situazione:

$_GET['id'] = 2
$_POST['id'] NON ESISTE
$_REQUEST['id'] = 2
$_SESSION['id'] NON ESISTE
$_COOKIE['id'] NON ESISTE
$_SERVER['id'] NON ESISTE
$id = 2 (prodotto dal register_globals)

Non solo: se all'interno dello script valorizzo, ad esempio, $_POST['id']=4, il valore non viene trasferito alla variabile globale $id, in quanto il register_globals viene eseguito solo a inizio script.

Un trattamento particolare viene utilizzato solo per le variabili di sessione, il cui scopo è quello di "portarsi dietro" i valori da una pagina all'altra. In questo caso quindi l'assegnazione del valore alla variabile globale si riflette anche sull'array $_SESSION, purché la variabile fosse già definita in sessione all'inizio dello script.
La prova è che se esegui il codice postato inizialmente da Graboid, aggiungendogli davanti l'assegnazione $_SESSION['usergroup']=1, il risultato è quello da lui descritto solo dalla seconda esecuzione in poi, quando cioè la variabile $usergroup è già registrata in sessione. La prima volta invece il valore della variabile di sessione appena impostata non viene influenzato dall'assegnazione effettuata sulla variabile globale.

Provo a spiegarmi meglio:

pagina.php?var=2

Se in pagina.php ho questo codice:
Codice PHP:
session_start();
$_SESSION['var'] = 1;
$var $_GET['var'];
echo 
$_SESSION['var']; 
Alla prima esecuzione il risultato della echo sarà 1, mentre dalla seconda in poi sarà sempre 2.
Questo perché l'assegnazione del valore 2 alla variabile $var si riflette anche su $_SESSION['var'] solo quando tale variabile di sessione era già impostata all'inizio di script, il che non accade alla prima esecuzione.

Spero sia chiaro. Comunque NON E' VERO che gli array superglobali sono tutti uguali. E' semplicemente vero che i loro valori vengono riportati, in fase di avvio dello script, nelle variabili globali.
Ho effettuato i test con PHP 4.3.3