Undefined variable ou Undefined index

O que significa a mensagem do PHP "Notice: Undefined variable ou Undefined index" e como evitar esse tipo de erro.

Por Patrick Espake


Publicado em: 08/9/07
Valorize este artigo:
Nesse artigo irei explicar o que significa a mensagem do PHP "Notice: Undefined variable ou Undefined index" e como evitar esse tipo de erro.

Para entender esse tipo de mensagem, observe o exemplo abaixo:

<?php
$x = $y + 10;
?>


Executando esse script, que valor deve conter a variável $x?
Você deve responder, impossível dizer, não sei qual é o valor da variável $y. Para o PHP a resposta é a mesma, para ele está sendo feito a seguinte operação internamente:

<?php
$x = valor indefinido + 10;
?>


A maneira correta e fazer a seguinte operação:

<?php
$y = 5;
$x = $y + 10;
?>

ou

<?php
$y = 0;
$x = $y + 10;
?>


Toda vez que é feita uma operação com uma variável "valor indefinido" o PHP exibe a mensagem Notice: Undefined variable.

Muitas vezes os nossos problemas de programação são mais complexos, pois estamos trabalhando com variáveis passadas por SESSION, GET, POST e outros métodos, para trabalhar dessa forma e necessário avaliar a condição da variável, por exemplo:

<?php
if(!isset($y))
$y = 0;
?>


Esse script verifica se a variável existe, se a variável não existir é atribuído zero.

Pode ocorrer o mesmo erro quanto estamos trabalhando com arrays e tentamos acessar uma posição que não existe, por exemplo:

<?php
$info_funcionario = array("nome" => "Patrick Espake", "profissao" => "Programador");
echo $info_funcionario["email"];
?>


No script acima estou tentando acessar o índice "email" no array, esse índice não existe e o PHP exibe a mensagem Notice: Undefined index email.

Você pode fazer a seguinte afirmação: "Já programei assim em PHP e nunca apareceu esse erro!".

O que acontece é que essas notificações de erros podem ser configuradas no PHP.INI, muitos programadores em ambiente de desenvolvimento deixam configurado para exibir todos os erros e em ambiente de produção deixam configurado para não exibir os erros de notificação.

Para configurar o PHP.INI para mostrar todos os erros, você deve deixar a cláusula error_reporting da seguinte forma:

error_reporting = E_ALL

Para configurar o PHP.INI para não exibir as mensagens de notificação você deve deixar da seguinte forma:

error_reporting = E_ALL & ~E_NOTICE

Em outras linguagens de programação uma variável não inicializada pode conter qualquer coisa, no PHP é considerado como nulo ou como 0 em uma operação aritmética.

Além disso, é mais rápido escrever:

<?php
echo $_GET['id'];
?>

do que

<?php
if isset($_GET['id'])) echo $_GET['id'];
?>


Em casos extremos você pode usar o @ para ocultar as mensagens de notificação.

<?php
echo @$_GET['id'];
?>


Eu considero esse método muito rigoroso, então é melhor fazer o que você acha melhor. Essas notificações podem ajudar durante o desenvolvimento, para detectar determinados erros.





Comentários do artigo
Foram enviados 10 comentários ao artigo
6 comentários não revisados
4 comentários revisados:
Muito bom!
Por: paulo-henrique
10/5/09
Gostei mto do artigo...bem esclarecedor..mas ficou uma pequena dúvida ainda...

No caso de uma variável que veio de um $_POST["variavel"], onde devo usar o isset?

Eu tenho um checkbox e não sei se ele será marcado pelo usuário..e só consegui resolver esse erro no caso do checkbox não estiver selecionado, dando um valor vazio pra string:

if (isset($_POST["chkInf"]))
{
$plano = $_POST["chkInf"];
}
else
{
$plano = "";
}


Seria uma solução válida?


Vlw!
Valeu mesmo, de grande valia para quem usa XAMPP
Por: zigalex
07/3/12
Estava enfrentando esse problema desses avisos, com o servidor XAMPP, pois estava acostumado programar o PHP através do servidor AppServ a qual não acontecia esses erros, mas como AppServ não está sendo atualizado e parece que nem o suporte da parte do desenvolvedor, fui forçado a trocar pelo XAMPP, que já vem a configuração PHP.INI diferente, ou eu adptava meus scripts para que não dava mais erro (que passou a ser muito complicado), ou fazer que o seu artigo recomendou em relação ao PHP.INI, valeu mesmo, me ajudou bastante.
Valew!!!!
Por: tecprog
28/3/12
Kra, essas dicas me ajudaram a resolver um bugzinho numa avaliação.

Obrigado
Notice: Undefined index: id in C:xampphtdocslinuxstok-masterLinuxStokClientesList.php on line 35
Por: denisgoncalves
04/4/14
Olá, pessoal!
Estou desenvolvendo um sistema e na pagina ClientesList.php, eu recebo uma mensagem do php seque a mensagem e o codigo:
Notice: Undefined index: id in C:xampphtdocslinuxstok-masterLinuxStokClientesList.php on line 35

<?php include_once("includes/header.php");?>
<?php include_once('includes/menu.php');?>
<div id="content">
<div class="pg">
<span style="display:none">
<span class="ms ok">ok</span>
<span class="ms no">Erro</span>
<span class="ms al">Alerta</span>
<span class="ms in">Informação</span>
</span>
<div class="bloco list" style="display:block">
<div class="titulo">Listagem Clientes:<span class="btn"><a href="ClientesInsert.php">Inserir Novo</a></span>

<form name="filtro" action="" method="post">
<label>
<input type="text" name="Id" class="radius" size="30" value="Titulo:"
onclick="if(this.value=='Titulo:')this.value=''"
onblur="if(this.value=='')this.value='Titulo:'"
/>
</label>
<input type="submit" value="filtrar resultados" name="sendFiltro" class="btn" />
</form>

</div><!-- /titulo -->

<table width="1000" border="0" class="tbdados" style="float:left;" cellspacing="0" cellpadding="0">
<tr class="ses">
<td>Nome:</td>
<td align="center">Telefone:</td>
<td align="center">Celular:</td>
<td align="center">CPF:</td>
<td align="center" colspan="3">Ações:</td>
</tr>
<?php
$Busca = $_POST['Id']; // o erro está acorrendo nesta linha
$Quantidade = 10;
$Pagina = (isset($_GET['pagina'])) ? (int)$_GET['pagina'] : 1;
$Inicio = ($Quantidade * $Pagina) - $Quantidade;
$Select = mysql_query("SELECT * FROM clientes WHERE Nome LIKE '%$Busca%' AND IdUsuario = '$IdUsuario' ORDER BY Id DESC");
while($ResultadoSelect = mysql_fetch_array($Select)){
?>
<?php if(isset($_GET['Cliente'])){
$Resgate = $_GET['Cliente'];
$Delete = mysql_query("DELETE FROM clientes WHERE Identificador = '$Resgate'");
echo"<script>alert('Cliente deletado com sucesso!')</script>";
echo"<script>window.location = 'ClientesList.php'</script>";
}
?>
<tr>
<td><?php echo $ResultadoSelect['Nome'] ?></td>
<td align="center"><?php echo $ResultadoSelect['Telefone'] ?></td>
<td align="center"><?php echo $ResultadoSelect['Celular'] ?></td>
<td align="center"><?php echo $ResultadoSelect['Cpf'] ?></td>
<td align="center"><a href="ClientesUpdate.php?Cliente=<?php echo $ResultadoSelect['Identificador'] ?>" title="editar"><img src="ico/edit.png" alt="editar" title="editar" /></a></td>
<td align="center"><a href="ClientesList.php?Cliente=<?php echo $ResultadoSelect['Identificador'] ?>" title="editar"><img src="ico/no.png" alt="excluir" title="excluir" /></a></td>
</tr>
<?php
}
?>
</table>
<div class="paginator">
<?php
$ListTotal = mysql_query("SELECT Id FROM clientes WHERE IdUsuario = '$IdUsuario'");
$ContarTotal = mysql_num_rows($ListTotal);
$TotalPagina = ceil($ContarTotal/$Quantidade);
echo'<a href="?pagina=1">primeira</a>';
for($i = 1; $i <= $TotalPagina; $i++){
if($i == $Pagina){
echo $i;
}else{
echo'<span class="selected"><a href="?pagina='.$i.'">'.$i.'</a></span>';
}
echo'<a href="?pagina='.$TotalPagina.'">última</a>';
}
?>
</div><!-- /paginator -->
</div><!-- /bloco list -->

</div><!-- pg -->
</div><!-- /content -->

<?php include_once("includes/footer.php");?>

Usuários :    login / registro

Manuais relacionados
Categorias relacionadas
O autor

Home | Sobre nós | Copyright | Anuncie | Entrar em contato