O poder das variáveis superglobais do PHP – Parte II

elephpant2Nesta segunda parte do artigo, vamos trabalhar com as matrizes superglobais que contém informações sobre o ambiente, sobre o servidor, sobre a sessão e ainda veremos as versões ultrapassadas de todas as variáveis superglobais, e o porquê de não utilizá-las mais.


  1. Acessando informações do ambiente e do servidor
  2. Manipulando variáveis de sessão com $_SESSION
  3. Versões ultrapassadas das variáveis superglobais


1. Acessando informações do ambiente e do servidor

Usando os vetores associativos $_SERVER e $_ENV podemos, respectivamente, obter dados do servidor e do ambiente. Vamos começar com os valores contidos em $_SERVER.

$_SERVER é um vetor que contém diversas informações sobre o servidor onde o arquivo está sendo executado, como caminhos, CHARSET, idioma, informações sobre o webserver, etc. Como este vetor é preenchido pelo webserver, algumas informações podem ser omitidas, ou podem haver informações a mais das que eu estarei exibindo para vocês. Abaixo, as principais informações fornecidas pelo meu servidor local:

HTTP_USER_AGENT

Contém informações sobre a máquina do usuário que requisitou a página (navegador e Sistema Operacional). Para mim, a informação é a seguinte: Opera/9.64 (Windows NT 6.0; U; pt-BR) Presto/2.1.1

HTTP_HOST

Nome do servidor para o qual foi feita a requisição. No meu caso, “localhost”.

HTTP_ACCEPT

Se a requisição contiver um cabeçalho, este índice terá o seu valor. O valor que eu obtive, já que eu não coloquei nenhum cabeçalho no meu arquivo, foi o seguinte: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1

HTTP_ACCEPT_LANGUAGE

Esse conteúdo também vem do cabeçalho, referindo-se à linguagem do documento. Como não informei nenhum cabeçalho usando header(), o valor para mim foi pt-BR,pt;q=0.9,en;q=0.8

HTTP_ACCEPT_CHARSET

Charset da página, se informado no cabeçalho. Novamente, eu não informei, e o padrão para meu webserver é: iso-8859-1, utf-8, utf-16, *;q=0.1

HTTP_COOKIE

Exibe as informações do cookie da sessão atual com o servidor.

SystemRoot

Exibe o caminho para o diretório root do sistema operacional. Como estou usando o Windows Vista Home Premium, o caminho exibido é “C:/Windows”

SERVER_SOFTWARE

Exibe o nome e versão do webserver instalado no servidor, bem como a versão do PHP que ele está executando. Estou usando o Apache com o PHP 5.2.8 e o valor para este índice é “Apache/2.2.11 (Win32) PHP/5.2.8″.

SERVER_NAME

Nome do servidor onde o Webserver está instalado. No meu caso, é o “localhost”. No servidor onde está este blog, o resultado para o nome do servidor seria “andresa.net”

SERVER_ADDR

Endereço IP do servidor onde o webserver (no meu caso, o Apache) está instalado junto ao PHP.

SERVER_PORT

Porta padrão do servidor para requisições HTTP. A porta padrão do Apache é a porta 80.

REMOTE_ADDR

Endereço IP do usuário que está acessando o arquivo.

DOCUMENT_ROOT

Caminho padrão para a pasta raiz da navegação no webserver. No Apache, é o caminho completo para o famoso diretório “www”, que é onde todos os arquivos do site devem ser postos.

SCRIPT_FILENAME

Caminho absoluto completo para o arquivo .php em execução.

SERVER_PROTOCOL

Versão do protocolo que está sendo utilizado na requisição.

REQUEST_METHOD

Método pelo qual o arquivo foi requisitado. Pode ser GET ou POST, como visto na primeira parte deste artigo.

QUERY_STRING

A Query String refere-se às variáveis passadas via GET logo após o nome do arquivo .php. Por exemplo, para a seguinte URL:

www.exemplo.com.br/site/index.php?modulo=noticias&id=1

a query_string é “modulo=noticias&id=1″.

REQUEST_URI

A URI é composta do nome do servidor + caminho relativo para o arquivo requisitado + query string. Por exemplo, para a seguinte URL:

www.exemplo.com.br/site/index.php?modulo=noticias&id=1

O REQUEST_URI será “/site/index.php?modulo=noticias&id=1″.

PHP_SELF

Caminho relativo para o arquivo .php que está sendo executado. Por exemplo, para a url “www.exemplo.com.br/site/index.php?modulo=noticias&id=1″, o PHP_SELF será “/site/teste.php”

REQUEST_TIME

Timestamp representando o momento exato da requisição.


Caso precise exibir todos os valores contidos em $_SERVER no seu servidor, crie um arquivo .php e use o seguinte código:


print_r($_SERVER);

Para imprimir valores individualmente ou manipulá-los, apenas coloque o índice desejado no vetor $_SERVER. Ex:

echo $_SERVER['PHP_SELF'];

2. Manipulando sessões com o $_SESSION e $_COOKIE

Quando você vai ao massagista (você já foi? eu nunca fui XD), o tempo em que você entra em contato com ele e desfruta dos serviços dele, até o momento ao qual você sai do local do atendimento dele, é chamado de “sessão”. Sessão portanto é o nome dado a um intervalo de tempo no qual você está recebendo (ou fornecendo) um determinado serviço. Em se tratando de aplicações WEB com PHP, é quase a mesma coisa: a sessão é dada como o espaço de tempo em que o usuário está interagindo com a aplicação, desde o momento em que ele visitou a primeira página do site até o momento em que ele fechar o navegador dele. Contudo, as sessões no PHP possuem outras habilidades especiais. A partir do momento em que uma sessão entre o programa e o usuário é iniciada, é possível guardar dados do usuário, e esses dados podem ser únicos, podendo ser uma forma de diferenciar o usuário e lembrar-se dele e de suas preferências no site.

Cookies são (se você já sabe, pode pular para o próximo parágrafo deste texto =D) pequenos arquivos de texto que podem ser armazenados no cache do navegador do usuário. Esses arquivos têm como objetivo guardar pequenas informações para que estas sejam relembradas da próxima vez em que o usuário visitar o site. Um cookie tem um tempo de vida definido pelo programador da aplicação, mas também pode ser excluído manualmente pelo usuário. Os cookies são indispensáveis quando se trata do uso de sessões, já que sem eles, a sessão é simplesmente destruída assim que o navegador é fechado. A seguir, veremos como ambos trabalham em conjunto.

Quando uma sessão é iniciada, uma identificação única (ID) é criada para ela, permitindo assim associar um único usuário a uma única sessão. Para iniciar uma sessão no PHP, usamos a seguinte função:

session_start();

Essa função não possui parâmetros, portanto, as configurações da sessão devem ser feitas antes dela ser iniciada. Uma sessão pode ter um nome, e este é definido antes de iniciarmos a sessão, como você pode ver abaixo:

session_name('seusite');
session_start();

Também é possível definir a quantidade de tempo que o cache da sessão permanecerá no servidor onde o site está hospedado. Esse limite de tempo representa o tempo de vida da sessão. Da mesma forma, temos que definir a quantidade de tempo que o cookie da sessão permanecerá vivo na máquina do usuário:

/*
Tempo de vida do cache da sessão
em MINUTOS */

//o login será válido por 2 dias
$dias=2;
//Sessão válida por 2 dias
session_cache_expire(3600*24*$dias);

//Cookie válido por 2 dias
session_set_cookie_params(3600 * 60*24*$dias, "/");

//Nome da sessão
session_name('seusite');
//Inicia a sessão
session_start();

Caso o valor de $dias seja definido como 0 (zero), a sessão “morrerá” quando o navegador do usuário for fechado.
Agora que possuímos a sessão aberta, podemos gravar dados nas “variáveis de sessão”, da seguinte forma:

session_name("seusite");
session_start();

$_SESSION['usuario']="admin";
$_SESSION['nome']="Andresa Martins";
$_SESSION['sexo']="a";

session_write_close();

//vai imprimir "Seja bem-vinda, Andresa Martins";
echo "Seja bem-vind".$_SESSION['sexo'].", ".$_SESSION['nome'].".";

Agora você gravou uma sessão, e o PHP associa a sessão ao cookie com o nome “seusite”. Se você usar o comando echo em $_COOKIE['seusite'], ele irá imprimir na tela a id da sessão.

O principal motivo de utilizarmos sessões no PHP é permitir ao usuário “fazer login” no site e ter acesso a conteúdos restritos. Esta matéria ficaria muito extensa para se escrever nas páginas, portanto criei um exemplo de sistema de cadastro e login utilizando sessões. Ele está totalmente explicado nos comentários, e, se você estudou corretamente a primeira parte deste artigo, vai entender perfeitamente o código todo.

Clique aqui para baixar o Exemplo de sistema de cadastro e login com sessões e cookies (92).

3.Versões ultrapassadas das variáveis superglobais

Você já deve ter visto por aí variáveis com a sintaxe $HTTP_GET_VARS['nome_da_variavel']. Se não viu, ótimo, mas é bom aprender para o caso de pegar um programa antigo para mexer. Hoje, para acessar valores externos, nós usamos as matrizes superglobais, como já visto neste artigo. Contudo, antes da versão 4.1.0 do PHP, eram usadas as variáveis pré-definidas, e elas possuem a seguinte sintaxe:

$HTTP_XXX_VARS

onde XXX pode ser GET, POST, SERVER, SESSION, entre outros, exatamente como fazemos hoje com as matrizes superglobais, que são definidas da seguinte forma:

$_XXX

No PHP 5 as variáveis pré-definidas são desativadas por padrão pois são obsoletas, mas você pode ativá-las no php.ini, mudando register_long_arrays para “On”. No PHP6 o suporte a elas já foi totalmente removido, portanto, nem pense em usá-las agora.

Embora pareça que a diferença está somente na nomenclatura, as variáveis pré-definidas possuem uma diferença muito importante para as superglobais. Estas últimas, como o próprio nome já diz, são globais em qualquer lugar do escopo do programa, mesmo dentro de funções ou classes. As pré-definidas NÃO são globais, portanto, você deve definí-las como globais para poder usar seus valores dentro de uma função (a não ser que o register_globals esteja ativado). Observe o exemplo abaixo:

/*
URL da requisição:

http://localhost/teste.php?nome=Andresa

*/
function mostrar_get()
{
	echo $HTTP_GET_VARS['nome'];
}

function mostrar_get2()
{
	echo $_GET['nome']
}
mostrar_get();
mostrar_get2();

A primeira função retornará um erro, já que a variável $HTTP_GET_VARS não existe dentro da função, somente fora dela. Já a segunda função irá imprimir “Andresa” na tela, pois $_GET é global em todo o escopo de variáveis. Para funcionar corretamente com o $HTTP_GET_VARS, seria necessário declará-lo como global, da seguinte forma:


function mostrar_get()
{
	global $HTTP_GET_VARS;
	echo $HTTP_GET_VARS['nome'];
}

mostrar_get();

IMPORTANTE: se você estiver usando uma versão do PHP acima de 4.1.0 e quiser testar esses códigos acima, não se esqueça de habilitar a opção register_long_arrays no php.ini, como dito acima.

Esta foi a segunda parte e o fim deste artigo. Espero que lhes tenha sido útil. Escrevi ele inspirada pelo meu amigo Vinícius Assi, que está fazendo um TCC na área de WEB, já estamos no meio do ano, e ele ainda não sabe nadinha de programação =)

Estuda, Vinícius! (e vocês também, queridos leitores ^__^)

  1. Oi seu sistema ficou bem estruturado, estava com um problema no meu login que era na sessão, e consequi resolver com session_name('meu'); , valeu parabéns pelo seu blog…

    Tira a bandeira do palmeiras… srrsrsrsrs
    Brincadeira
    Sucessos

    Deivid – MG

Spam protection by WP Captcha-Free

line
footer
Powered by Wordpress | Adaptado por Andresa Martins