Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Beraldo

As Mensagens de Erros mais Comuns do PHP

Recommended Posts

As linguagens de programação geram mensagens de erros e warnings, que sempre informam o problema presente no código-fonte - quem conhece o Segmentation Fault do C/C++ pode querer discordar de mim :P -, de forma que a initerpretação correta dessas mensagens frequentemente indicam a forma adeequada de corrigir o problema.

 

Porém, poucos programadores iniciantes analisam essas mensagens, seja por falta de conhecimento ou preguiça mesmo. Ou até medo...

 

Vou mostrar aqui as mensagens de erro mais frequentes do PHP, junto com suas principais causas e soluções.

 

 

Sumário

[anchorlink=enable_errors]Habilitando todas as mensagens de erro[/anchorlink]

[anchorlink=err_op]Retirar o Operador de Controle de Erros[/anchorlink]

[anchorlink=parse_error]Parse Error[/anchorlink]

[anchorlink=undef_index]Undefined Index[/anchorlink]

[anchorlink=""]Undefined Variable[/anchorlink]

[anchorlink=header]Cannot modify header information[/anchorlink]

[anchorlink=undef_func]Call to undefined function[/anchorlink]

[anchorlink=class_notfound]Class not found[/anchorlink]

[anchorlink=undef_method]Call to undefined method[/anchorlink]

[anchorlink=call_member_func]Call to a member function on a non-object[/anchorlink]

[anchorlink=mysql_result_resource]supplied argument is not a valid MySQL result resource[/anchorlink]

[anchorlink=foreach]Invalid argument supplied for foreach()[/anchorlink]

[anchorlink=conclusao]Conclusão[/anchorlink]

 

[anchor=enable_errors]Habilitando todas as mensagens de erro[/anchor]

 

Antes de tudo, é bom saber que o PHP é muito personalizável - o que às vezes pode ser um problema. É possível desabilitar todas as mensagens de erro, ou limitar somente a alguns níveis de erro. Não vou explicar os níveis de erro do PHP, pois não é o foco do texto. Porém deixarei links para referência.

 

Para habilitar todas as mensagens de erro do PHP, basta inserir este trecho no início do script:

ini_set( 'display_errors', 1 );
error_reporting( E_ALL | E_STRICT );

 

Documentação da função ini_set

Documentação da função error_reporting

Funções para manipulação de erros

Descrição da diretiva error_reporting do php.ini

Descrição da diretiva display_errors do php.ini

 

 

[anchor=err_op]Retirar o Operador de Controle de Erros[/anchor]

 

Outro ponto a ser observado é que é possível omitir erros no pHP usando o Operador de Controle de Erros, o famoso arroba (@). Esse operador existe para ser usado, mas use-o com cautela, quando for realmente necessário.

 

Entenda quando usar o Operador de Controle de Erros (arroba - @)

Documentação do Operador de Controle de Erros

 

 

[anchor=parse_error]Parse Error[/anchor]

 

Parse Errors ocorrem quando seu código possui erros de formatação, como caractere faltando ou em excesso.

 

Por exemplo:

<?php
phpinfo);
?>

 

Retornará o erro:

Parse error:  syntax error, unexpected ')' in teste.php on line 2

 

A correção é sempre muito simples: analisar a linha onde o erro ocorre e procurar o acarctere indicado pelo erro. Pode estar faltando algo ou sobrando alguma coisa. Note que o erro pode não estra na linha indicada pela mensagem de erro. Pode estar na anterior. Por exemplo:

 

<?php
echo 'oi'
echo 'oi de novo';
?>

 

Mensagem de erro:

Parse error:  syntax error, unexpected T_ECHO, expecting ',' or ';' in teste.php on line 3

 

A mensagem diz que há erro na linha 3, mas é a linha 2 que gera problema, devido à falta do ponto-e-vírgula no final do echo.

 

 

[anchor=undef_index]Undefined Index[/anchor]

 

Esse erro ocorre quando tenta-se acessar um índice inexistente de um array. Esse erro é muito comum com iniciantes usando Query String. O famoso exemplo:

 

<?php
$pag = $_GET['pag'];
?>

 

Se não existe a variável "pag" na URL, dará este erro:

PHP Notice:  Undefined index: pag in teste.php on line 2

 

Para evitar esse erro, sempre verifique se o índice existe. A função isset resolve facilmente esse problema:

 

if ( isset( $_GET['pag'] ) )
{
   $pag = $_GET['pag'];
}
else
{
   $pag = 'valor padrão';
}

 

O código pode ser reescrito sda seguinte forma, usando o Operador Condicional Ternário:

$pag = isset( $_GET['pag'] ) ? $_GET['pag'] : 'valor_padrao';

 

Mais sobre o Operador Ternário aqui:

http://www.php.net/manual/pt_BR/language.operators.comparison.php

 

 

 

[anchor=""]Undefined Variable[/anchor]

 

Como o erro mostra claramente, isso ocorre quando se tenta usar uma variável não declarada (ou definida, no caso do PHP).

 

<?php
echo $var;
?>

 

Erro:

PHP Notice:  Undefined variable: var in teste.php on line 2

 

A solução não poderia der outra: criar a variável antes de usá-la.

Logicamente, o erro pode ter ocorrido por um erro de digitação do nome da variável.

 

 

 

[anchor=header]Cannot modify header information[/anchor]

 

Essa mensagem de erro está ligada a envio de cabeçalhos HTTP, o que envolve sessions, cookies, a própria função header, do PHP.

 

O envio de cabeçalhos HTTP devem ser realizados sempre antes de qualquer saída ao navegador, ou seja, sempre antes de códigos HTML e funções que exibam dados, como echo, print, print_r etc. Também não pode haver espaços vazios no código, antes da tag <?.

 

O membro hinom, do iMasters Fóruns, escreveu um excelente tutorial sobre isso, que pode ser visto no link abaixo:

http://forum.imasters.com.br/index.php?/topic/342563-dicas-para-uso-de-variaveis-de-sessao

 

 

[anchor=undef_func]Call to undefined function[/anchor]

 

Novamente, o erro é claro: foi feita uma chamada a uma função não definida.

 

<?php
beraldo();
?>

 

Erro:

Fatal error:  Call to undefined function beraldo() in teste.php on line 2

 

Para corrigir, defina a função. Pode ter havido erro de digitação do nome da função ou falta de inclusão do arquivo que a define.

 

 

[anchor=class_notfound]Class not found[/anchor]

 

Ocorre quando o PHP não encontra a classe que se deseja instanciar.

 

<?php
$b = new Beraldo();
?>

 

Erro:

Fatal error:  Class 'beraldo' not found in teste.php on line 2

 

Como no erro anterior, a solução é declarar a classe, além de verificar se não houve erro de digitação ou falta de inclusão de arquivo.

 

 

 

[anchor=undef_method]Call to undefined method[/anchor]

 

Ocorre quando se chama um método inexistente de uma classe.

 

<?php

class Beraldo
{
public function darOi()
{
	echo "oi";
}
}

$Beraldo = new Beraldo();
$Beraldo->darTchau();

?>

 

Erro:

Fatal error:  Call to undefined method Beraldo::darTchau() in teste.php on line 12

 

Deve-se criar o método ou verificar se não houve erro de digitação do nome do método.

 

 

 

 

[anchor=call_member_func]Call to a member function on a non-object[/anchor]

 

Isso ocorre quando se chama um método em uma variável que não é uma instância de um objeto.

 

<?php
$var = 'oi, sou uma string';
$var->metodo();
?>

 

Erro:

Fatal error:  Call to a member function metodo() on a non-object in teste.php on line 3

 

Para solucionar o erro, verifique se não usou a variável errada ou se não modificou o valor original da variável, de forma a ter perdido a instância do objeto.

 

 

[anchor=mysql_result_resource]supplied argument is not a valid MySQL result resource[/anchor]

 

Esse erro ocorre quando uma função espera, como parâmetro, um resource retornado por outra função do MySQL. O mais comum é ocorrer erro na linha onde há a função <code>mysql_fetch_assoc()</code>, <code>mysql_fetch_array()</code> e semlhantes. Isso quer dizer que o parâmetro passado não é um resource retornado por <code>mysql_query()</code>, o que indica que a consulta falhiou e <code>mysql_query()</code> retornou FALSE.

 

Mensagem de erro:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ...

 

A solução é corrigir a query executada. Muitas vezes o erro é simples, apenas nome de tabela ou campo errados, ou erro de sintaxe. Para visualizar o erro retornado pelo MySQL, pode-se usar a função <code>mysql_error()</code>. Logo, deve-se executar a consulta desta maneira:

 

$exec = mysql_query( $sua_consulta_aqui ) or exit( mysql_error() );

 

Caso a consulta falhe, ou seja, <code>mysql_query</code> retorne FALSE, a função <code>exit()</code> finalizará a execução do script, mostrando o erro do MySQL, devido à função <code>mysql_error()</code>. Ler a mensagem de erro ajuda a encontrar o erro na consulta SQL.

 

OBS: Mostrei exemplo usando MySQL, mas recomendo fortemente que seja usada a extensão MySQLi, que é bem mais completa, além de prover recuersos novos do MySQL 4.1.

 

 

[anchor=foreach]Invalid argument supplied for foreach()[/anchor]

 

Esse erro ocorre quando o argumento passado para o loop foreach não é um array.

 

<?php
$var = '';
foreach ( $var as $k )
{
echo $k;
}
?>

 

Erro:

Warning:  Invalid argument supplied for foreach() in teste.php on line 3

 

Como <code>$var</code> é uma string, foi gerado o erro. Para corrigir, basta verificar se o parâmetro está correto ou se ele não foi modificado durante a execução do script, deixando de ser um array.

 

 

 

[anchor=conclusao]Conclusão[/anchor]

 

As mensagens de erros geralmente são muito claras. Portanto, leia-as atentamente antes de perguntar para alguém ou criar um tópico em um fórum só para isso. Muitas vezes os erros são de fácil correção, bastando ler com cuidado das mensagens de erro.

 

 

 

------------------------------------

 

Post original aqui:

http://www.rberaldo.com.br/blog/2011/01/29/as-mensagens-de-erros-mais-comuns-do-php/

 

 

Eu apenas copiei o que postei no blog e fiz uns find/replace para inserir os BBCode's, não revisando todos os links. Caso haja algum errado, favor avisar, que corrijo.

 

 

Abraços,

 

Beraldo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu, pessoal!

É básico, mas irrita ver tanta gente postando algo como "o que significa esse erro?".

Espero que este artigo seja útil para essas pessoas.

 

Contribuições são sempre bem-vindas! :joia:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito bom cara de verdade, acho que você poderia indicar uma pequena dica que é a seguinte:

 

Quando comecei a programar eu verificava o erro e ia na linha que mandava, pra minha surpresa quase nunca era nessa linha.

 

um exemplo disso é a falta do ; (ponto e virgula) no final.

 

<?php
  $var1 = 'Variavel 1'
  $var = 'Variavel';
?>

 

o erro vai indicar algo falho na linha 3 o que não é verdade.

 

é uma coisa bem simples mais que pode preparar melhor os programadores para resolver os seus problemas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.