você está aqui: Home  → Arquivo de Mensagens

Tratando "variable is not defined" no PHP

Colaboração: André Milani

Data de Publicação: 19 de outubro de 2012

A mensagem de erro variable is not defined é uma antiga conhecida de programadores PHP e está relacionada diretamente ao acesso a uma variável que não tenha sido inicializada com algum valor anteriormente. Ao receber dúvidas de vários alunos, resolvi comentar os casos recebidos e apresentar soluções.

Falta de definição de valor (caso simples)

Em um dos códigos que observei, um comando for era montado da seguinte forma para realizar uma somatória:

  for($i=0; $i<10; $i++)
  {
  $total += $i;
  }
  
  echo $total;

Este código resultará no erro variable is not defined pois a variável $total não foi inicializada antes de ser utilizada. Como a variável não foi inicializada, na primeira execução do bloco de código do comando for o compilador tentará atribuir para $total o resultado da operação nada + 0. Observe que para o compilador nada é diferente de 0, o que acarretará na inviabilidade de realizar a soma. Para solucionar este problema, basta atribuir um valor para a variável $total antes do comando for, da seguinte forma:

  $total = 0;
  
  for($i=0; $i<10; $i++)
  {
  $total += $i;
  }
  
  echo $total;

Falta de definição de valor (caso register_globals)

O PHP possui um recurso conhecido como register globals, uma configuração no arquivo php.ini que permite que algumas variáveis sejam inicializadas pelo PHP. Vale a pena citar que este recurso tornou-se obsoleto a partir do PHP 5.3.0 e seu uso não é mais encorajado.

Alguns programadores que utilizam o register_globals tem o costume de acessar diretamente suas variáveis, da seguinte forma:

  if($_REQUEST["minhaVar"] == "valor")
  {
  ...
  }

Até aí, tudo certo. Contudo, quando o programador migra seu código para outro servidor PHP, ou obtém um código deste tipo na web e o seu servidor não está configurado para utilizar o register_globals, o erro variable is not defined é exibido nas situações onde o código apresentado é executado e não há a variável minhaVar na requisição da página. Nestes casos, como o programador pegou o código de outro servidor onde o código já estava funcionando, ele tem dificuldades em entender o motivo que o código não executa em seu servidor. O motivo é: um dos servidores está com a register_globals habilitada, o outro não. Mas tem solução!

Solução 1: habilitar a register_globals

A solução mais simples para a maioria dos casos é habilitar o recurso de register_globals no PHP. Isto é fácil de ser feito e existe bastante documentação no site do PHP e no Google sobre este procedimento. Contudo, pode não ser viável, dependendo da versão do seu PHP. Neste caso, outra solução deve ser adotada.

Solução 2: tratando o código

É possível tratar no código o acesso das variáveis para que o acesso a elas quando não definidas seja realizado. Basta realizar um comando que verifica se a variável em questão foi setada ou não. O comando isset faz isso: ele verifica se determinada variável existe e pode ser acessada ou não. O mesmo código apresentado anteriormente poderia ser alterado para o seguinte formato:

  if(isset($_REQUEST["minhaVar"]))
  {
  if($_REQUEST["minhaVar"] == "valor")
  {
  ...
  }
  }

Desta forma, somente se a variável $_REQUEST["minhaVar"] possuir algum valor é que o

acesso a mesma será realizada dentro do bloco de código do primeiro if. Caso contrário, o acesso não será realizado, e a mensagem de erro não surgirá.

Vale a dica: é possível otimizar o comando if para escrevê-lo da seguinte forma:

  if(isset($_REQUEST["minhaVar"]) && $_REQUEST["minhaVar"] == "valor")
  {
  ...
  }

O que ocorre nesta forma de comando if é que a segunda condição (a de acesso a variável) somente é realizada se a primeira condição do if for verdadeira. Ou seja, a variável somente será acessada se possuir algum valor.

Gostou da dica? Assista uma aula grátis do curso de iOS criado pelo autor: André Milani é instrutor oficial do curso on-line de PHP & MySQL da Softblue onde possui um blog sobre PHP e bancos de dados http://, formado em Ciência da Computação pela PUC-PR, pós-graduado em Business Intelligence pela mesma instituição e possui diversas certificações na área de TI. É também autor de vários livros na área de informática. Possui mais de 10 anos de experiência em desenvolvimento web, atuando há mais de 6 anos com cursos e treinamentos de profissionais. //**


Veja a relação completa dos artigos de André Milani

 

 

Opinião dos Leitores

Celso
20 Out 2012, 13:39
Alguem aqui ja ouviu falar em boas praticas de programação?
Dutra
19 Out 2012, 14:53
Melhor completar com um "else" (associado ao "if" inserido) na primeira forma da segunda solução?
Santoja
19 Out 2012, 08:01
Acho mais fácil desabilitar o NOTICES, o PHP assume um valor default para a variavel nula
gustavo
19 Out 2012, 07:32
Lembrando que não é seguro utilizar REGISTER_GLOBALS = ON, por isso que essa feature se tornou obsoleta.

Vide primeiro exemplo:
http://php.net/manual/pt_BR/security.globals.php

Outra ponto importante é que o erro 'not defined' é um NOTICE e não um erro em si, só é disparado quando temos:
error_reporting(E_ALL);
ou no php.ini
error_reporting = E_ALL

Esse valor pode mudar, e em boa parte dos servidores é definido para não mostrar os NOTICEs, em ambientes de produção normalente são configurados para não mostrar nenhum erro por questões de segurança.
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script