As Mensagens de Erros Mais Comuns do PHP

As Mensagens de Erros Mais Comuns do PHP

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.

Orientações Iniciais

Habilitando todas as mensagens de erro
Retirar o Operador de Controle de Erros

Mensagens de Erro Comuns

Parse Error
Unexpected end
Undefined Index
Undefined Variable
Use of undefined constant
Cannot modify header information
Call to undefined function
Class not found
Call to undefined method
Call to a member function on a non-object
supplied argument is not a valid MySQL result resource
The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead
Invalid argument supplied for foreach()
Parse error: syntax error, unexpected ‘[‘
Conclusão

Habilitando todas as mensagens de erro

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 aqui os níveis de erro do PHP, mas você pode ler mais sobre isso neste post.

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

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

Para mais detalhes, veja este post.

Retirar o Operador de Controle de Erros

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

Parse Error

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

Por exemplo:

1
2
<?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:

1
<?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.

Unexpected end

Unexpected end significa “fim inespetado”. Ou seja, o fim do arquivo foi encontrado antes do esperado. Isso significa que algum caractere duplo (como aspas, colchetes, chaves ou parênteses) não foi fechado.

Vejamos um exemplo:

$x = 1;
if ( $x == 1 )
{
    echo "x é um";

Note que não fechamos as chaves do bloco do if. Ao executar o script acima, será gerado este erro:

Parse error: syntax error, unexpected end of file in test.php on line 7

A solução é simples: procurar um caractere duplo que foi aberto mas não foi fechado. A correta indentação ajuda muito nesses casos.

Undefined Index

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:

1
2
3
<?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:

1
2
3
4
5
6
7
8
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:

1
$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

Também veja este post para mais informações.

Undefined Variable

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

1
2
3
<?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.

Também veja este post e este outro para mais informações.

Use of undefined constant

Esse erro ocorre quando uma constante é usada antes de ser definida. Por exemplo:

<?php 
 
echo QUALQUER_COISA;

Ao executar esse script, será gerado este erro:

PHP Notice:  Use of undefined constant QUALQUER_COISA - assumed 'QUALQUER_COISA' in test.php on line 3

Na verdade, não é um erro. É um aviso (um notice). Ou seja, a execução continua. O PHP assume que, como não existe a constante QUALQUER_COISA, ele deve exibir a string “QUALQUER_COISA”. Por isso que, mesmo ocorrendo erro, é exibida a string “QUALQUER_COISA” na tela.

É muito comum programadores iniciantes, que não usam aspas nas strings. Por exemplo:

$arr = array(
    'chave_1' => 'valor 1',
    'chave_2' => 'valor 2',
);
 
echo $arr[chave_1];

Ao executar o trecho acima, será gerado um NOTICE dizendo que a constante chave_1 não existe e foi tratada como string. Consequentemente, a string “valor 1” foi exibida.

A solução é simples: use aspas em todas as strings. Caso contrário, o PHP tentará encontrar constantes com esses nomes.

Veja este post para mais informações.

Cannot modify header information

Essa mensagem de erro é muito frequente aos iniciantes, mas a solução é muito simples.

Ela está ligada a envio de cabeçalhos HTTP, o que envolve sessions, cookies e as funções header, session_start e setcookie do PHP.

O envio de cabeçalhos HTTP deve 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 <?php.

Em suma, antes de funções como session_start, setcookie e header não pode existir NENHUMA saída ao navegador. Isso inclui qualquer código HTML, echo, print ou um simples espaço em branco antes da tag de abertura do PHP (<?php). Se o script que está gerando o erro faz inlude/require de outro script, verifique esse outro também.

Outro detalhe é o BOM. O BOM (Byte Order Mark, ou Marca de Ordem de Byte) é uma sequência de caracteres que é inserida no início de um arquivo para definir a ordem dos bytes. Isso é outra razão para esse problema.

Por isso use sempre UTF-8 sem BOM e não terá problemas.

É possível usar as Funções de Controle de Saída, como ob_start e ob_end_clean, para controlar o buffer de saída e contronar o problema de chamar as funções que enviam cabeçalho depois de sáidas ao navegador.

Call to undefined function

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

1
2
3
<?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.

Class not found

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.

Call to undefined method

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

1
2
3
4
5
6
7
8
9
10
11
12
<?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.

Call to a member function on a non-object

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

1
2
3
4
<?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.

supplied argument is not a valid MySQL result resource

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 mysql_fetch_assoc(), mysql_fetch_array() e semlhantes. Isso quer dizer que o parâmetro passado não é um resource retornado por mysql_query(), o que indica que a consulta falhiou e mysql_query() 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 mysql_error(). Logo, deve-se executar a consulta desta maneira:

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

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

IMPORTANTE: funções mysql_* (como mysql_connect, mysql_query e semelhantes) estão obsoletas desde o PHP 5.5 e devem ser removidas do PHP em breve. Prefira usar MySQLi ou PDO. Veja mais neste link

The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead

A extensão mysql é considerada obsoleta desde o PHP 5.5. Ela foi removida no PHP 7.

A recomendação é usar a extensão mysqli ou a classe PDO.

Veja mais detalhes neste artigo.

Invalid argument supplied for foreach()

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

1
2
3
4
5
6
7
<?php
$var = '';
foreach ( $var as $k )
{
    echo $k;
}
?>

Erro:

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

Como $var é 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.

Parse error: syntax error, unexpected ‘[‘

Esse erro ocorre, muitas vezes, quando tentamos usar a nova sintaxe de definição de arrays, que só está disponível a partir do PHP 5.4.

Antes do PHP 5.4, a única sintaxe aceita para criação de arrays era a seguinte, usando a função array:

1
2
3
4
5
$arr = array(
    'uno',
    'due',
    'tre'
);

A partir do PHP 5.4, podemos usar colchetes, desta maneira:

1
2
3
4
5
$arr = [
    'uno',
    'due',
    'tre'
];

Veja mais detalhes sobre a sintaxe de arrays no Manual do PHP.

Conclusão

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.

Todas as mensagens de erro do PHP são em inglês. Se você tiver dificuldades com esse idioma, sugiro dedicar algumas horas por dia para estudá-lo. Sugiro começar lendo este meu post, onde indico algumas ótimas fontes de estudo de Inglês.

 

Essas e inúmeras outras dicas e técnicas eu abordo com mais detalhes no meu Curso ULTIMATE PHP. Estude PHP desde o básico, de forma 100% prática. Aprenda como se tornar um excelente programador, reconhecido e valorizado. Clique Aqui e Conheça o Curso Agora Mesmo!

 

The following two tabs change content below.
Graduado em Ciência da Computação, pela Universidade Federal do Paraná (UFPR), é desenvolvedor de software desde 2008, com foco em Desenvolvimento Web com PHP.