De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
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.
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;
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!
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.
É 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. //**
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários