Beraldo 864 Denunciar post Postado Janeiro 29, 2011 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
JCMais 75 Denunciar post Postado Fevereiro 3, 2011 Good Work ;) Compartilhar este post Link para o post Compartilhar em outros sites
Alaerte Gabriel 662 Denunciar post Postado Fevereiro 4, 2011 Beraldo, excelente matéria :joia: Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Fevereiro 4, 2011 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
Matias Rezende 50 Denunciar post Postado Fevereiro 4, 2011 Com certeza ajudará. Adicionei ao tópico de orientações para uma boa participação. Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Fevereiro 4, 2011 Adicionei ao tópico de orientações para uma boa participação. Valeu, Matias! Espero que o pessoal leia! :thumbsup: Compartilhar este post Link para o post Compartilhar em outros sites
hinom 5 Denunciar post Postado Fevereiro 7, 2011 ficou massa Beraldo. :joia: Compartilhar este post Link para o post Compartilhar em outros sites
Vinicius Rangel 208 Denunciar post Postado Maio 29, 2012 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
A. Sobrinho 1 Denunciar post Postado Julho 8, 2012 Excelente.... Resolveu meus problemas com erros. Compartilhar este post Link para o post Compartilhar em outros sites