Referência - O que esse erro significa no PHP?


1137

O que é isso?

Esta é uma série de respostas sobre avisos, erros e avisos que você pode encontrar ao programar o PHP e não tem idéia de como corrigi-los. Este também é um Wiki da comunidade; portanto, todos são convidados a participar, adicionando e mantendo esta lista.

Por que é isso?

Perguntas como "Cabeçalhos já enviados" ou "Chamando um membro de um não-objeto" são exibidas com freqüência no Stack Overflow. A causa raiz dessas perguntas é sempre a mesma. Portanto, as respostas para essas perguntas normalmente as repetem e, em seguida, mostram ao OP qual linha alterar no seu caso específico. Essas respostas não agregam valor ao site porque se aplicam apenas ao código específico do OP. Outros usuários com o mesmo erro não podem ler facilmente a solução porque estão localizados demais. Isso é triste porque, depois de entender a causa raiz, a correção do erro é trivial. Portanto, esta lista tenta explicar a solução de uma maneira geral para aplicar.

O que devo fazer aqui?

Se sua pergunta foi marcada como duplicada, encontre sua mensagem de erro abaixo e aplique a correção ao seu código. As respostas geralmente contêm mais links para investigar, caso não deva ficar claro apenas da resposta geral.

Se você quiser contribuir, adicione sua mensagem de erro, aviso ou aviso "favorito", um por resposta, uma breve descrição do significado (mesmo que apenas destaque os termos da página de manual), uma possível solução ou abordagem de depuração e uma lista de perguntas e respostas existentes que são valiosas. Além disso, fique à vontade para melhorar as respostas existentes.

A lista

Veja também:


7
Além disso, para mover a discussão fora dos comentários, por favor vá para esta questão meta
Earlz



Respostas:


275

Aviso: Não é possível modificar as informações do cabeçalho - os cabeçalhos já enviados

Acontece quando seu script tenta enviar um cabeçalho HTTP para o cliente, mas já havia uma saída anterior, o que resultou no envio de cabeçalhos ao cliente.

Este é um E_WARNINGe não irá parar o script.

Um exemplo típico seria um arquivo de modelo como este:

<html>
    <?php session_start(); ?>
    <head><title>My Page</title>
</html>
...

A session_start()função tentará enviar cabeçalhos com o cookie da sessão para o cliente. Mas o PHP já enviou cabeçalhos quando escreveu o <html>elemento no fluxo de saída. Você teria que mover o session_start()para o topo.

Você pode resolver isso percorrendo as linhas antes do código acionar o aviso e verificar onde ele sai. Mova qualquer cabeçalho que envie o código antes desse código.

Uma saída frequentemente ignorada são as novas linhas após o fechamento do PHP ?>. É considerado uma prática padrão omitir ?>quando é a última coisa no arquivo. Da mesma forma, outra causa comum para esse aviso é quando a abertura <?phptem um espaço vazio, linha ou caractere invisível à sua frente, fazendo com que o servidor da Web envie os cabeçalhos e o espaço em branco / nova linha, portanto, quando o PHP iniciar a análise, não será possível enviar qualquer cabeçalho.

Se o seu arquivo tiver mais de um <?php ... ?>bloco de código, você não deve ter espaços entre eles. (Nota: você pode ter vários blocos se tiver código construído automaticamente)

Verifique também se você não possui nenhuma marca de ordem de bytes no código, por exemplo, quando a codificação do script for UTF-8 com BOM.

Perguntas relacionadas:


2
Se você estiver usando o WordPress, verifique os arquivos do tema. Quando atualizei um site para uma nova versão do WordPress, não consegui atualizar o tema porque ele não foi atualizado há vários anos. Este problema surgiu. Aconteceu que o arquivo functions.php tinha mais de um <? ?> bloco com espaços no meio.
Roy Leban 31/03

2
@RoyLeban "Se o seu arquivo tiver mais de um bloco ..." Não sei ao certo o que isso significa. O que é um "bloco"? Um bloco seria composto <?php ?>e, portanto, "mais de um bloco" seria <?php ?> <?php ?>?
Andrew Fox

2
Por favor, ative o recurso 'buffer de saída' no arquivo de configuração do PHP.ini, se possível. Ele é usado para solucionar esse problema. os cabeçalhos são emitidos em um local diferente, o cabeçalho antigo será substituído pelo novo cabeçalho.
Nidhin David

191

Erro fatal: chamar uma função de membro ... em um não-objeto

Ocorre com código semelhante ao local xyz->method()onde xyznão é um objeto e, portanto, methodnão pode ser chamado.

Este é um erro fatal que interromperá o script (aviso de compatibilidade direta: ele se tornará um erro capturável a partir do PHP 7).

Na maioria das vezes, isso é um sinal de que o código está faltando nas verificações de condições de erro. Valide que um objeto é realmente um objeto antes de chamar seus métodos.

Um exemplo típico seria

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

No exemplo acima, a consulta não pode ser preparada e prepare()será atribuída falsea $statement. Tentar chamar o execute()método resultará no Erro Fatal porque falseé um "não-objeto" porque o valor é um booleano.

Descubra por que sua função retornou um booleano em vez de um objeto. Por exemplo, verifique o $pdoobjeto para o último erro que ocorreu. Os detalhes sobre como depurar isso dependerão de como os erros são tratados para a função / objeto / classe em questão.

Se mesmo o ->prepareestiver falhando, o $pdoobjeto de manipulação do banco de dados não será passado para o escopo atual . Encontre onde foi definido. Em seguida, passe-o como um parâmetro, armazene-o como propriedade ou compartilhe-o por meio do escopo global.

Outro problema pode ser a criação condicional de um objeto e a tentativa de chamar um método fora desse bloco condicional. Por exemplo

if ($someCondition) {
    $myObj = new MyObj();
}
// ...
$myObj->someMethod();

Ao tentar executar o método fora do bloco condicional, seu objeto pode não estar definido.

Perguntas relacionadas:


115

Nada é visto. A página está vazia e branca.

Também conhecida como Página Branca da Morte ou Tela Branca da Morte . Isso acontece quando o relatório de erros é desativado e ocorre um erro fatal (geralmente erro de sintaxe).

Se você tiver ativado o log de erros, encontrará a mensagem de erro concreta no seu log de erros. Isso geralmente está em um arquivo chamado "php_errors.log", em um local central (por exemplo, /var/log/apache2em muitos ambientes Linux) ou no diretório do próprio script (às vezes usado em um ambiente de hospedagem compartilhada).

Às vezes, pode ser mais simples ativar temporariamente a exibição de erros. A página em branco exibirá a mensagem de erro. Tome cuidado, pois esses erros são visíveis para todos que visitam o site.

Isso pode ser feito facilmente adicionando na parte superior do script o seguinte código PHP:

ini_set('display_errors', 1); error_reporting(~0);

O código ativará a exibição de erros e definirá os relatórios para o nível mais alto.

Como o ini_set()é executado em tempo de execução, ele não afeta os erros de análise / sintaxe. Esses erros aparecerão no log. Se você deseja exibi-los também na saída (por exemplo, em um navegador), é necessário definir a display_startup_errorsdiretiva para true. Faça isso no php.iniou em um .htaccessou por qualquer outro método que afete a configuração antes do tempo de execução .

Você pode usar os mesmos métodos para definir os log_errors e error_log directivas de escolher seu próprio local do arquivo de log.

Olhando no log ou usando a tela, você receberá uma mensagem de erro muito melhor e a linha de código em que seu script é interrompido.

Perguntas relacionadas:

Erros relacionados:


3
error_reporting(~0);por que não -1? É isso que ~0avalia e é muito menos enigmático.
Fabrício Matté 31/03

3
Eu acho que ambos são igualmente enigmáticos. ~0é IMO mais explícito: anule o conjunto de bits vazio, ou seja, ative todos os sinalizadores. -1 não significa «não encontrado» como em strpos () em C, mas como um conjunto de bits com todos os sinalizadores definidos, porque -1 é binário 1111'1111'1111'1111(para 32 bits).
nalply

2
Opa, 1111'1111'1111'1111são realmente 16 bits, mas espero que você entenda o que quero dizer.
nalply

3
@IvanSolntsev, desculpe não, para versões anteriores à 5.4, E_STRICTnão está incluído no E_ALL. php.net/manual/en/errorfunc.constants.php e role para baixo até E_STRICT.
nalply 12/05

102

Aviso: Índice Indefinido

Acontece quando você tenta acessar uma matriz por uma chave que não existe na matriz.

Um exemplo típico de um Undefined Indexaviso seria ( demo )

$data = array('foo' => '42', 'bar');
echo $data['spinach'];
echo $data[1];

Ambos spinache 1não existem na matriz, fazendo com que um E_NOTICEseja acionado.

A solução é garantir que o índice ou deslocamento exista antes de acessar esse índice. Isso pode significar que você precisa corrigir um erro no seu programa para garantir que esses índices existam quando você espera. Ou pode significar que você precisa testar se os índices existem usando array_key_existsou isset:

$data = array('foo' => '42', 'bar');
if (array_key_exists('spinach', $data)) {
    echo $data['spinach'];
}
else {
    echo 'No key spinach in the array';
}

Se você tiver um código como:

<?php echo $_POST['message']; ?>
<form method="post" action="">
    <input type="text" name="message">
    ...

então $_POST['message']não será definido quando esta página for carregada pela primeira vez e você receberá o erro acima. Somente quando o formulário é enviado e esse código é executado uma segunda vez, o índice da matriz existe. Você normalmente verifica isso com:

if ($_POST)  ..  // if the $_POST array is not empty
// or
if ($_SERVER['REQUEST_METHOD'] == 'POST') ..  // page was requested with POST

Perguntas relacionadas:


I tendem a usarif(!empty($_POST['message'])){ //do stuff }
kurdtpage

85

Atenção: mysql_fetch_array () espera que o parâmetro 1 seja um recurso, dado booleano

Em primeiro lugar:

Por favor, não use mysql_*funções no novo código . Eles não são mais mantidos e são oficialmente descontinuados . Veja a caixa vermelha ? Aprenda sobre as instruções preparadas e use o DOP ou o MySQLi - este artigo o ajudará a decidir quais. Se você escolher a DOP, aqui está um bom tutorial .


Isso acontece quando você tenta buscar dados do resultado, mysql_querymas a consulta falhou.

Este é um aviso e não interrompe o script, mas fará com que seu programa esteja errado.

Você precisa verificar o resultado retornado mysql_querypor

$res = mysql_query($sql);
if (!$res) {
   die(mysql_error());
}
// after checking, do the fetch

Perguntas relacionadas:

Erros relacionados:

Outras mysql*funções que também esperam um recurso de resultado do MySQL como parâmetro produzirão o mesmo erro pelo mesmo motivo.


5
Apenas uma nota. Se mysql_querynão for ruim o suficiente, adicionar or diemais insultos à lesão.
Ghost de Madara

O problema que encontro é $res = mysql_query($query)retornará 1 se a consulta for bem-sucedida e, portanto, for considerada verdadeira. Portanto, ao passar o resultado de mysql_query para mysql_fetch_array() o aviso mostra.
MBoy

@mboy Para SELECT, SHOW, DESCRIBE, EXPLAIN e outras instruções que retornam resultados, mysql_query () retorna um recurso em caso de sucesso ou FALSE em erro. Para outros tipos de instruções SQL, INSERT, UPDATE, DELETE, DROP, etc, mysql_query () retorna TRUE em caso de sucesso ou FALSE em caso de erro.
Xdazz

@xdazz Esse é o problema que estou enfrentando. A inserção de atualização retorna VERDADEIRO, para que eu não possa me livrar desse erro mysql_fetch_array() expects parameter 1 to be resource, boolean given in select , consulte - gist.github.com/romelemperado/93af4cdbd44ebf3a07cbfa0e3fc539d7 Alguma sugestão para se livrar desse erro?
MBoy

2
@mboy mysql_fetch_array()é para consulta de seleção, para inserção e atualização, você não precisa buscar o conjunto de resultados (e nenhum conjunto de resultados permite que você busque).
Xdazz

79

Erro fatal: usar $ this quando não estiver no contexto do objeto

$thisé uma variável especial em PHP que não pode ser atribuída. Se for acessado em um contexto em que não existe, esse erro fatal será fornecido.

Este erro pode ocorrer:

  1. Se um método não estático for chamado estaticamente. Exemplo:

    class Foo {
       protected $var;
       public function __construct($var) {
           $this->var = $var;
       }
    
       public static function bar () {
           // ^^^^^^
           echo $this->var;
           //   ^^^^^
       }
    }
    
    Foo::bar();

    Como corrigir: revise seu código novamente,$thissó pode ser usado em um contexto de objeto e nunca deve ser usado em um método estático. Além disso, um método estático não deve acessar a propriedade não estática. Useself::$static_propertypara acessar a propriedade estática.

  2. Se o código de um método de classe foi copiado para uma função normal ou apenas para o escopo global e mantendo a $thisvariável especial.
    Como corrigir: revise o código e substitua $thispor uma variável de substituição diferente.

Perguntas relacionadas:

  1. Chame o método não estático como estático: PHP Erro fatal: usando $ this quando não estiver no contexto do objeto
  2. Copiar código: Erro fatal: usar $ this quando não estiver no contexto do objeto
  3. Todas as perguntas "Usando $ this quando não estiver no contexto do objeto" no Stackoverflow

2
Você também pode mencionar como isso funciona com fechamentos (mesmo em métodos não estáticos) e como é "corrigido" na 5.4.
Kendall Hopkins

2
@hakre Eu estava falando sobre uma chamada estática dentro de um Closure. Like $closure = function() { self::method(); }.
Kendall Hopkins

2
@KendallHopkins: Esse é um erro diferente: "Erro fatal: não é possível acessar self :: quando nenhum escopo de classe está ativo" No entanto, $thisvocê pode acionar o "Erro fatal: usando $ this quando não estiver no contexto do objeto" :$closure = function() { $this->method(); };
hakre

75

Erro fatal: Chamada para a função indefinida XXX

Acontece quando você tenta chamar uma função que ainda não está definida. As causas comuns incluem extensões ausentes e incluem declaração de função condicional, função em uma declaração de função ou erros simples de digitação.

Exemplo 1 - Declaração de Função Condicional

$someCondition = false;
if ($someCondition === true) {
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

Nesse caso, fn()nunca será declarado porque $someConditionnão é verdade.

Exemplo 2 - Função na declaração de função

function createFn() 
{
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

Nesse caso, fnserá declarado apenas quando createFn()for chamado. Observe que as chamadas subsequentes para createFn()acionarão um erro sobre a redeclaração de uma função existente.

Você também pode ver isso para uma função interna do PHP. Tente procurar a função no manual oficial e verifique a qual "extensão" (módulo PHP) ela pertence e quais versões do PHP a suportam.

No caso de uma extensão ausente, instale essa extensão e ative-a no php.ini. Consulte as Instruções de instalação no Manual do PHP para obter a extensão em que sua função aparece. Você também pode habilitar ou instalar a extensão usando o gerenciador de pacotes (por exemplo, aptno Debian ou Ubuntu, yumno Red Hat ou CentOS) ou em um painel de controle em um ambiente de hospedagem compartilhada.

Se a função foi introduzida em uma versão mais recente do PHP a partir do que você está usando, você pode encontrar links para implementações alternativas no manual ou na seção de comentários. Se ele foi removido do PHP, procure informações sobre o motivo, pois pode não ser mais necessário.

Em caso de inclusão perdida, inclua o arquivo que declara a função antes de chamá-la.

Em caso de erros de digitação, corrija o erro de digitação.

Perguntas relacionadas:


73

Erro de análise: erro de sintaxe, T_XXX inesperado

Acontece quando você tem um T_XXXtoken em um lugar inesperado, parênteses desequilibrados (supérfluos), uso de tags curtas sem ativá-las no php.ini e muito mais.

Perguntas relacionadas:

Para obter mais ajuda, consulte:


70

Erro fatal: não é possível usar o valor de retorno da função no contexto de gravação

Isso geralmente acontece ao usar uma função diretamente com empty.

Exemplo:

if (empty(is_null(null))) {
  echo 'empty';
}

Isso ocorre porque, emptycomo uma construção de linguagem e não uma função, ela não pode ser chamada com uma expressão como argumento nas versões do PHP anteriores à 5.5. Antes do PHP 5.5, o argumento empty()deve ser uma variável , mas uma expressão arbitrária (como o valor de retorno de uma função) é permitida no PHP 5.5+.

empty, apesar do nome, na verdade não verifica se uma variável está "vazia". Em vez disso, verifica se uma variável não existe ou == false. Expressões (como is_null(null)no exemplo) sempre serão consideradas existentes, portanto, aqui emptysó é verificado se é igual a falso. Você pode substituir empty()aqui por !, por exemplo if (!is_null(null)), ou comparar explicitamente com falso, por exemplo if (is_null(null) == false).

Perguntas relacionadas:


64

MySQL: você tem um erro na sua sintaxe SQL; verifique o manual que corresponde à sua versão do servidor MySQL para obter a sintaxe correta perto de ... na linha ...

Esse erro geralmente é causado porque você esqueceu de escapar corretamente dos dados passados ​​para uma consulta MySQL.

Um exemplo do que não fazer (a "má ideia"):

$query = "UPDATE `posts` SET my_text='{$_POST['text']}' WHERE id={$_GET['id']}";
mysqli_query($db, $query);

Esse código pode ser incluído em uma página com um formulário a ser enviado, com um URL como http://example.com/edit.php?id=10 (para editar a postagem nº 10)

O que acontecerá se o texto enviado contiver aspas simples? $queryvai acabar com:

$query = "UPDATE `posts` SET my_text='I'm a PHP newbie' WHERE id=10';

E quando essa consulta é enviada ao MySQL, ela reclama que a sintaxe está errada, porque há uma citação única extra no meio.

Para evitar tais erros, você DEVE sempre escapar dos dados antes de usá- los em uma consulta.

A fuga de dados antes do uso em uma consulta SQL também é muito importante porque, se não o fizer, seu script estará aberto para injeções de SQL. Uma injeção de SQL pode causar alteração, perda ou modificação de um registro, tabela ou banco de dados inteiro. Esse é um problema de segurança muito sério!

Documentação:


3
Além disso, se você não o fizer, o site será invadido por bots automaticamente
apscience 7/07

2
@gladoscc Clique em "editar" e modifique a resposta. Estou ciente de que pode ser melhorado.
Jocelyn

2
Ou use uma consulta sql preparada.
Matej 4/13

53

Erro fatal: esgotado o tamanho da memória de XXX bytes (tentou alocar XXX bytes)

Não há memória suficiente para executar seu script. O PHP atingiu o limite de memória e para de executá-lo. Este erro é fatal, o script para. O valor do limite de memória pode ser configurado no php.iniarquivo ou usando ini_set('memory_limit', '128 M');o script (que substituirá o valor definido em php.ini). O objetivo do limite de memória é impedir que um único script PHP consuma toda a memória disponível e derrube todo o servidor da web.

A primeira coisa a fazer é minimizar a quantidade de memória que seu script precisa. Por exemplo, se você está lendo um arquivo grande em uma variável ou está buscando muitos registros de um banco de dados e armazenando todos eles em uma matriz, isso pode consumir muita memória. Altere seu código para ler o arquivo linha por linha ou buscar registros do banco de dados, um de cada vez, sem armazenar todos na memória. Isso requer um pouco de consciência conceitual do que está acontecendo nos bastidores e quando os dados são armazenados na memória e em outros lugares.

Se esse erro ocorreu quando o script não estava executando um trabalho intensivo de memória, você precisa verificar seu código para verificar se há um vazamento de memória. A memory_get_usagefunção é sua amiga.

Perguntas relacionadas:


53

Erro de análise: erro de sintaxe, inesperado T_ENCAPSED_AND_WHITESPACE

Esse erro é encontrado com mais freqüência ao tentar referenciar um valor de matriz com uma chave entre aspas para interpolação dentro de uma cadeia de caracteres entre aspas duplas quando toda a construção de variável complexa não está entre {}.

O caso de erro:

Isso resultará em Unexpected T_ENCAPSED_AND_WHITESPACE:

echo "This is a double-quoted string with a quoted array key in $array['key']";
//---------------------------------------------------------------------^^^^^

Correções possíveis:

Em uma string entre aspas, PHP permitirá cordas principais matriz para ser usado sem aspas , e não emitirá uma E_NOTICE. Portanto, o acima pode ser escrito como:

echo "This is a double-quoted string with an un-quoted array key in $array[key]";
//------------------------------------------------------------------------^^^^^

Toda a variável e chave (s) complexa (s) da matriz podem ser incluídas {}, caso em que devem ser citadas para evitar um E_NOTICE. A documentação do PHP recomenda esta sintaxe para variáveis ​​complexas.

echo "This is a double-quoted string with a quoted array key in {$array['key']}";
//--------------------------------------------------------------^^^^^^^^^^^^^^^
// Or a complex array property of an object:
echo "This is a a double-quoted string with a complex {$object->property->array['key']}";

Obviamente, a alternativa a qualquer uma das opções acima é concatenar a variável da matriz em vez de interpolá-la:

echo "This is a double-quoted string with an array variable". $array['key'] . " concatenated inside.";
//----------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^

Para referência, consulte a seção Análise de Variáveis na página de manual do PHP Strings


45

Aviso: [função] : falha ao abrir o fluxo: [motivo]

Isso acontece quando você chama um arquivo normalmente por include, requireou fopene o PHP não conseguiu encontrar o arquivo ou não tem permissão suficiente para carregá-lo.

Isso pode acontecer por vários motivos:

  • o caminho do arquivo está errado
  • o caminho do arquivo é relativo
  • incluir caminho errado
  • permissões são muito restritivas
  • SELinux está em vigor
  • e muitos mais ...

Um erro comum é não usar um caminho absoluto. Isso pode ser facilmente resolvido usando um caminho completo ou constantes mágicas como __DIR__ou dirname(__FILE__):

include __DIR__ . '/inc/globals.inc.php';

ou:

require dirname(__FILE__) . '/inc/globals.inc.php';

Garantir que o caminho certo seja usado é um passo para solucionar esses problemas, isso também pode estar relacionado a arquivos inexistentes, direitos do sistema de arquivos que impedem o acesso ou restrições baseadas em aberto pelo próprio PHP.

A melhor maneira de resolver esse problema rapidamente é seguir a lista de verificação de solução de problemas abaixo.

Perguntas relacionadas:

Erros relacionados:


44

Erro de análise: erro de sintaxe, inesperado T_PAAMAYIM_NEKUDOTAYIM

O operador de resolução do escopo também é chamado "Paamayim Nekudotayim" do hebraico פעמיים נקודתיים. o que significa "dois pontos duplos".

Esse erro normalmente ocorre se você inadvertidamente inserir ::seu código.

Perguntas relacionadas:

Documentação:


A maneira mais fácil de acionar esse erro está sendo executada a()::b;ou $a=::;.
Ismael Miguel

43

Aviso: Uso da constante indefinida XXX - assumida 'XXX'

ou, no PHP 7.2 ou posterior:

Aviso: Uso da constante indefinida XXX - assumida 'XXX' (isso gerará um erro em uma versão futura do PHP)

Esse aviso ocorre quando um token é usado no código e parece ser uma constante, mas uma constante com esse nome não está definida.

Uma das causas mais comuns deste aviso é uma falha ao citar uma sequência usada como chave de matriz associativa.

Por exemplo:

// Wrong
echo $array[key];

// Right
echo $array['key'];

Outra causa comum é um $sinal ausente (dólar) na frente de um nome de variável:

// Wrong
echo varName;

// Right
echo $varName;

Ou talvez você tenha escrito incorretamente outra constante ou palavra-chave:

// Wrong
$foo = fasle;

// Right
$foo = false;

Também pode ser um sinal de que uma biblioteca ou extensão PHP necessária está ausente quando você tenta acessar uma constante definida por essa biblioteca.

Perguntas relacionadas:


2
Eu diria que a causa mais comum é esquecer $ na frente de uma variável, não matrizes.
Overv

42

Erro fatal: não é possível redefinir a classe [nome da classe]

Erro fatal: não é possível redeclarar [nome da função]

Isso significa que você está usando o mesmo nome de função / classe duas vezes e precisa renomear um deles, ou é porque você usou requireou includeonde deveria usar require_onceou include_once.

Quando uma classe ou função é declarada em PHP, ela é imutável e não pode ser declarada posteriormente com um novo valor.

Considere o seguinte código:

class.php

<?php

class MyClass
{
    public function doSomething()
    {
        // do stuff here
    }
}

index.php

<?php

function do_stuff()
{
   require 'class.php';
   $obj = new MyClass;
   $obj->doSomething();
}

do_stuff();
do_stuff();

A segunda chamada para do_stuff()produzirá o erro acima. Ao mudar requirepara require_once, podemos ter certeza de que o arquivo que contém a definição de MyClassserá carregado apenas uma vez e o erro será evitado.


3
Vale a pena mencionar o uso de carregamento automático, e padrões como PSR-4 ou mesmo o PSR-0 agora obsoleto se livram disso, poupando-o da necessidade de usar exigir / incluir você mesmo (exceto alguns casos extremos bizarros).
DanielM

39

Aviso: variável indefinida

Acontece quando você tenta usar uma variável que não foi definida anteriormente.

Um exemplo típico seria

foreach ($items as $item) {
    // do something with item
    $counter++;
}

Se você não definiu $counterantes, o código acima acionará o aviso.

A maneira correta seria definir a variável antes de usá-la, mesmo que seja apenas uma string vazia como

$counter = 0;
foreach ($items as $item) {
    // do something with item
    $counter++;
}

Aviso: propriedade indefinida

Este erro significa praticamente a mesma coisa, mas refere-se à propriedade de um objeto. Reutilizando o exemplo acima, esse código acionaria o erro porque a counterpropriedade não foi definida.

$obj = new stdclass;
$obj->property = 2342;
foreach ($items as $item) {
    // do something with item
    $obj->counter++;
}

Perguntas relacionadas:


35

Erro de análise: erro de sintaxe, inesperado T_VARIABLE

Cenário possível

Não consigo encontrar onde meu código deu errado. Aqui está o meu erro completo:

Erro de análise: erro de sintaxe, T_VARIABLE inesperado na linha x

O que estou tentando

$sql = 'SELECT * FROM dealer WHERE id="'$id.'"';

Responda

Erro de análise: um problema com a sintaxe do seu programa, como deixar um ponto-e-vírgula no final de uma instrução ou, como no caso acima, perder o .operador. O intérprete para de executar seu programa quando encontra um erro de análise.

Em palavras simples, este é um erro de sintaxe, o que significa que há algo no seu código que impede que ele seja analisado corretamente e, portanto, em execução.

O que você deve fazer é verificar cuidadosamente as linhas ao redor de onde está o erro para erros simples.

Essa mensagem de erro significa que, na linha x do arquivo, o intérprete PHP esperava ver um parêntese aberto, mas encontrou algo chamado T_VARIABLE. Essa T_VARIABLEcoisa é chamada de token. É a maneira do interpretador PHP de expressar diferentes partes fundamentais dos programas. Quando o intérprete lê um programa, ele traduz o que você escreveu em uma lista de tokens. Sempre que você coloca uma variável em seu programa, há um T_VARIABLEtoken na lista do intérprete.

Boa leitura: lista de tokens do analisador

Portanto, certifique-se de ativar pelo menos o E_PARSEseu php.ini. Os erros de análise não devem existir nos scripts de produção.

Eu sempre recomendei adicionar a seguinte declaração, durante a codificação:

error_reporting(E_ALL);

Relatório de erro do PHP

Além disso, é uma boa idéia usar um IDE que informe erros de análise durante a digitação. Você pode usar:

  1. NetBeans (um belo pedaço de beleza, software livre) (o melhor na minha opinião)
  2. PhpStorm (o tio Gordon adora: P, plano pago, contém software proprietário e gratuito)
  3. Eclipse (a bela e a fera, software livre)

Perguntas relacionadas:


34

Aviso: deslocamento de cadeia não inicializado: *

Como o nome indica, esse tipo de erro ocorre quando você provavelmente tenta repetir ou encontrar um valor de uma matriz com uma chave inexistente.

Considere você, está tentando mostrar todas as letras de $string

$string = 'ABCD'; 
for ($i=0, $len = strlen($string); $i <= $len; $i++){
    echo "$string[$i] \n"; 
}

O exemplo acima irá gerar ( demonstração online ):

A
B
C
D
Notice: Uninitialized string offset: 4 in XXX on line X

E, assim que o script terminar de eco, Dvocê receberá o erro, porque dentro dofor() loop, você disse ao PHP para mostrar o caractere da primeira à quinta string de 'ABCD'Which, existe, mas desde que o loop começa a contar 0e ecoa Dno momento em que atinge 4, gera um erro de deslocamento.

Erros semelhantes:


32

Aviso: Tentando obter propriedade de erro não-objeto

Acontece quando você tenta acessar uma propriedade de um objeto enquanto não há nenhum objeto.

Um exemplo típico de um aviso sem objeto seria

$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object

Nesse caso, $usersé uma matriz (portanto, não um objeto) e não possui propriedades.

É semelhante ao acesso a um índice ou chave não existente de uma matriz (consulte Aviso: Índice Indefinido ).

Este exemplo é muito simplificado. Na maioria das vezes, esse aviso sinaliza um valor de retorno não verificado, por exemplo, quando uma biblioteca retorna NULLse um objeto não existe ou apenas um valor não-objeto inesperado (por exemplo, em um resultado Xpath, estruturas JSON com formato inesperado, XML com formato inesperado etc.) mas o código não verifica essa condição.

Como esses não-objetos geralmente são processados ​​posteriormente, geralmente ocorre um erro fatal ao chamar um método de objeto em um não-objeto (consulte: Erro fatal: chamar uma função de membro ... em um não-objeto ) interrompendo o roteiro.

Pode ser facilmente evitado verificando condições de erro e / ou se uma variável corresponde a uma expectativa. Aqui está um aviso com um exemplo DOMXPath :

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object

O problema é acessar a nodeValuepropriedade (campo) do primeiro item enquanto ele não foi verificado se existe ou não na $resultcoleção. Em vez disso, vale a pena tornar o código mais explícito, atribuindo variáveis ​​aos objetos nos quais o código opera:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$div     = $result->item(0);
$divText = "-/-";
if (is_object($div)) {
    $divText = $div->nodeValue;
}
echo $divText;

Erros relacionados:


1
json_decodeagora retorna uma instância stdclasspor padrão, então o código de exemplo seria realmente funcionar.
Hugo Zink

@HugoZink: Na verdade, (e sempre retornou), uma matriz para esse exemplo: 3v4l.org/SUDe0 - Você também pode fornecer uma referência para a sua escrita que " json_decodeagora retorna uma instância stdclasspor padrão" ? Não consigo encontrar isso no changelog.
hakre

De acordo com a página do manual do PHP em json_decode , por padrão, o assocparâmetro está definido como false. Este parâmetro decide se a função retornará uma stdclassmatriz em vez de uma matriz associativa.
Hugo Zink

json_decode('[{"name": "hakre"}]', true)retornará uma matriz, de outro modo um stdclassobjecto
zanderwar

29

Aviso: restrição open_basedir em vigor

Esse aviso pode aparecer com várias funções relacionadas ao acesso a arquivos e diretórios. Ele alerta sobre um problema de configuração.

Quando aparece, significa que o acesso foi proibido em alguns arquivos.

O aviso em si não quebra nada, mas na maioria das vezes um script não funciona corretamente se o acesso a arquivos for impedido.

A correção normalmente é alterar a configuração do PHP , a configuração relacionada é chamadaopen_basedir .

Às vezes, os nomes de arquivos ou diretórios incorretos são usados, a correção é usar os corretos.

Perguntas relacionadas:


1
Isso ocorre com mais freqüência em um servidor compartilhado, as pessoas não costumam bloquear-se fora de diretórios :-)
uınbɐɥs

28

Erro de análise: erro de sintaxe, inesperado '['

Este erro ocorre em duas variáveis:

Variação 1

$arr = [1, 2, 3];

Esta sintaxe de inicializador de array foi introduzida apenas no PHP 5.4; isso gerará um erro do analisador nas versões anteriores a isso. Se possível, atualize sua instalação ou use a sintaxe antiga:

$arr = array(1, 2, 3);

Veja também este exemplo no manual.

Variação 2

$suffix = explode(',', 'foo,bar')[1];

Os resultados da função de desreferenciação de matriz também foram introduzidos no PHP 5.4. Se não for possível atualizar, você precisará usar uma variável (temporária):

$parts = explode(',', 'foo,bar');
$suffix = $parts[1];

Veja também este exemplo no manual.


23

Aviso: [função] espera que o parâmetro 1 seja um recurso, dado booleano

(Uma variação mais geral de Warning: mysql_fetch_array () espera que o parâmetro 1 seja um recurso, dado booleano )

Recursos são do tipo PHP (como strings, números inteiros ou objetos). Um recurso é um blob opaco sem valor próprio inerentemente significativo. Um recurso é específico e definido por um determinado conjunto de funções ou extensão do PHP. Por exemplo, a extensão Mysql define dois tipos de recursos :

Existem dois tipos de recursos usados ​​no módulo MySQL. O primeiro é o identificador de link para uma conexão com o banco de dados, o segundo é um recurso que mantém o resultado de uma consulta.

A extensão cURL define outros dois tipos de recursos :

... uma alça cURL e uma alça múltipla cURL.

Quando var_dumpeditados, os valores são assim:

$resource = curl_init();
var_dump($resource);

resource(1) of type (curl)

Isso é tudo o que há na maioria dos recursos, um identificador numérico ( (1)) de um determinado tipo ( (curl)).

Você carrega esses recursos e os passa para diferentes funções para as quais esse recurso significa alguma coisa. Normalmente, essas funções alocam certos dados em segundo plano e um recurso é apenas uma referência que eles usam para acompanhar esses dados internamente.


O erro " ... espera que o parâmetro 1 seja um recurso, dado booleano " geralmente é o resultado de uma operação desmarcada que deveria criar um recurso, mas retornou false. Por exemplo, a fopenfunção tem esta descrição:

Retornar valores

Retorna um recurso de ponteiro de arquivo em caso de sucesso ou FALSEerro.

Portanto, neste código, $fpserá um resource(x) of type (stream)ou false:

$fp = fopen(...);

Se você não verificar se a fopenoperação foi bem-sucedida ou falhou e, portanto, se $fpé um recurso válido ou se falsepassa $fppara outra função que espera um recurso, você pode obter o erro acima:

$fp   = fopen(...);
$data = fread($fp, 1024);

Warning: fread() expects parameter 1 to be resource, boolean given

Você sempre precisa verificar o valor de retorno das funções que estão tentando alocar um recurso e podem falhar :

$fp = fopen(...);

if (!$fp) {
    trigger_error('Failed to allocate resource');
    exit;
}

$data = fread($fp, 1024);

Erros relacionados:


22

Aviso: deslocamento ilegal de cadeia 'XXX'

Isso acontece quando você tenta acessar um elemento da matriz com a sintaxe entre colchetes, mas está fazendo isso em uma sequência e não em uma matriz, portanto a operação claramente não faz sentido .

Exemplo:

$var = "test";
echo $var["a_key"];

Se você acha que a variável deve ser uma matriz, veja de onde ela vem e corrija o problema.


20

O código não é executado / o que parece ser parte do meu código PHP é gerado

Se você não obtiver nenhum resultado do seu código PHP e / ou estiver vendo partes do seu código-fonte PHP literal na página da Web, pode ter certeza de que seu PHP não está sendo executado. Se você usa o View Source no seu navegador, provavelmente está vendo o arquivo de código-fonte PHP inteiro como está. Como o código PHP está incorporado nas <?php ?>tags, o navegador tentará interpretá-las como tags HTML e o resultado poderá parecer um pouco confuso.

Para realmente executar seus scripts PHP, você precisa:

  • um servidor web que executa seu script
  • para definir a extensão do arquivo como .php, caso contrário, o servidor da Web não a interpretará como tal *
  • para acessar seu arquivo .php através do servidor web

* A menos que você o reconfigure, tudo poderá ser configurado.

Este último é particularmente importante. Basta clicar duas vezes no arquivo para abri-lo no navegador usando um endereço como:

file://C:/path/to/my/file.php

Isso está ignorando completamente qualquer servidor Web que você possa estar executando e o arquivo não está sendo interpretado. Você precisa visitar o URL do arquivo no seu servidor web, provavelmente algo como:

http://localhost/my/file.php

Você também pode querer verificar se está usando tags abertas curtas em <?vez de <?phpe sua configuração do PHP desativou as tags abertas curtas.

Veja também que o código PHP não está sendo executado. Em vez disso, o código é exibido na página


18

Aviso: mysql_connect (): acesso negado para o usuário 'name' @ 'host'

Este aviso aparece quando você se conecta a um servidor MySQL / MariaDB com credenciais ausentes ou inválidas (nome de usuário / senha). Portanto, isso normalmente não é um problema de código, mas um problema de configuração do servidor.

  • Veja a página do manual mysql_connect("localhost", "user", "pw")para exemplos.

  • Verifique se você realmente usou a $usernamee $password.

    • É incomum que você obtenha acesso sem senha - e foi o que aconteceu quando o Aviso foi dito (using password: NO).
    • Somente o servidor de teste local geralmente permite a conexão com nome de usuário root, sem senha e com o testnome do banco de dados.

    • Você pode testar se eles estão realmente corretos usando o cliente de linha de comando:
      mysql --user="username" --password="password" testdb

    • Nome de usuário e senha diferenciam maiúsculas de minúsculas e os espaços em branco não são ignorados. Se sua senha contiver meta caracteres como $, escape-os ou coloque-a entre aspas simples .

    • A maioria dos provedores de hospedagem compartilhada pré-declara contas mysql em relação à conta de usuário unix (às vezes apenas prefixos ou sufixos numéricos extras). Consulte os documentos para obter um padrão ou documentação e o CPanel ou qualquer outra interface para definir uma senha.

    • Veja o manual do MySQL em Adicionando contas de usuário usando a linha de comando. Quando conectado como usuário administrador, você pode emitir uma consulta como:
      CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';

    • Ou use Adminer ou WorkBench ou qualquer outra ferramenta gráfica para criar, cheque ou conta correta detalhes.

    • Se você não conseguir consertar suas credenciais, solicitar à Internet que "ajude" não terá efeito. Somente você e seu provedor de hospedagem têm permissões e acesso suficiente para diagnosticar e consertar as coisas.

  • Verifique se você pode acessar o servidor de banco de dados usando o nome do host fornecido pelo seu provedor:
    ping dbserver.hoster.example.net

    • Verifique isso em um console SSH diretamente no seu servidor da web. Testar do cliente de desenvolvimento local para o servidor de hospedagem compartilhada raramente é significativo.

    • Geralmente, você deseja apenas o nome do servidor "localhost", que normalmente utiliza um soquete denominado local quando disponível. Outras vezes, você pode tentar "127.0.0.1"como substituto.

    • Caso seu servidor MySQL / MariaDB escute em uma porta diferente, use-o "servername:3306".

    • Se isso falhar, talvez haja um problema de firewall. (Fora do tópico, não é uma questão de programação. Não é possível ajudar a adivinhar remotamente.)

  • Ao usar constantes como, por exemplo , DB_USERou DB_PASSWORD, verifique se elas estão realmente definidas .

    • Se você recebe um "Warning: Access defined for 'DB_USER'@'host'"e um "Notice: use of undefined constant 'DB_PASS'", esse é o seu problema.

    • Verifique se o seu exemplo xy/db-config.phpfoi realmente incluído e o que mais.

  • Verifique as GRANTpermissões definidas corretamente .

    • Não é suficiente ter um par username+ password.

    • Cada conta do MySQL / MariaDB pode ter um conjunto de permissões anexado.

    • Esses podem restringir a quais bancos de dados você tem permissão para se conectar, de qual cliente / servidor a conexão pode se originar e quais consultas são permitidas.

    • O aviso "Acesso negado" também pode aparecer para mysql_querychamadas, se você não tiver permissões para SELECTuma tabela específica ou INSERT/ UPDATEe, mais comumente, DELETEqualquer coisa.

    • Você pode adaptar as permissões da conta quando conectado por cliente de linha de comando usando a conta de administrador com uma consulta como:
      GRANT ALL ON yourdb.* TO 'username'@'localhost';

  • Se o aviso aparecer primeiro Warning: mysql_query(): Access denied for user ''@'localhost', você pode ter um par de contas / senha pré-configurado pelo php.ini .

    • Verifique isso mysql.default_user=e mysql.default_password=tenha valores significativos.

    • Muitas vezes, essa é uma configuração de provedor. Portanto, entre em contato com o suporte para incompatibilidades.

  • Encontre a documentação do seu provedor de hospedagem compartilhada:

  • Observe que você também pode ter esgotado o pool de conexões disponível . Você receberá avisos de acesso negado para muitas conexões simultâneas. (Você precisa investigar a instalação. Esse é um problema de configuração de servidor externo, não uma questão de programação.)

  • Sua versão do cliente libmysql pode não ser compatível com o servidor de banco de dados. Normalmente, servidores MySQL e MariaDB podem ser acessados ​​com PHPs compilados no driver. Se você possui uma configuração personalizada ou uma versão PHP desatualizada e um servidor de banco de dados muito mais recente ou significativamente desatualizado - a incompatibilidade de versão pode impedir conexões. (Não, você precisa se investigar. Ninguém pode adivinhar sua configuração).

Mais referências:

Btw, você provavelmente não quer mysql_*mais usar funções . Os recém-chegados costumam migrar para o mysqli , que, no entanto, é igualmente tedioso. Em vez disso, leia a DOP e as declarações preparadas .
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");


2
O mysql permite a conexão automática através das configurações do php-ini, e a mesma mensagem de erro é fornecida com o comando diferente prefixado, por exemplo, "Aviso: mysql_query (): acesso negado ao usuário '' @ 'localhost' (usando a senha: NO) no. .. " - apenas observando.
hakre

Ha, esqueci totalmente disso! (Provavelmente usado pela última vez que com PHP3 ou assim ..)
mario

18

Aviso: conversão de matriz para string

Isso simplesmente acontece se você tentar tratar uma matriz como uma string:

$arr = array('foo', 'bar');

echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion

Uma matriz não pode simplesmente ser echoconcatenada com uma sequência, porque o resultado não está bem definido. O PHP usará a string "Array" no lugar da matriz e acionará o aviso para apontar que provavelmente não foi esse o objetivo e que você deveria verificar seu código aqui. Você provavelmente quer algo assim:

echo $arr[0];  // displays foo
$str = 'Something ' . join(', ', $arr); //displays Something, foo, bar

Ou faça um loop na matriz:

foreach($arr as $key => $value) {
    echo "array $key = $value";
    // displays first: array 0 = foo
    // displays next:  array 1 = bar
}

Se esse aviso aparecer em algum lugar que você não espera, significa que uma variável que você pensou ser uma string é na verdade uma matriz. Isso significa que você tem um erro no seu código que torna essa variável uma matriz em vez da string que você espera.


12

Aviso: Divisão por zero

A mensagem de aviso 'Divisão por zero' é uma das perguntas mais comuns entre os novos desenvolvedores de PHP. Este erro não causará uma exceção; portanto, alguns desenvolvedores ocasionalmente suprimirão o aviso adicionando o operador de supressão de erro @ antes da expressão. Por exemplo:

$value = @(2 / 0);

Mas, como em qualquer aviso, a melhor abordagem seria rastrear a causa do aviso e resolvê-lo. A causa do aviso virá de qualquer instância em que você tente dividir por 0, uma variável igual a 0 ou uma variável que não tenha sido atribuída (porque NULL == 0) porque o resultado será 'indefinido'.

Para corrigir esse aviso, você deve reescrever sua expressão para verificar se o valor não é 0, se for, faça outra coisa. Se o valor for zero, você não deve dividir ou alterar o valor para 1 e depois dividir para que a divisão resulte no equivalente a ter sido dividido apenas pela variável adicional.

if ( $var1 == 0 ) { // check if var1 equals zero
    $var1 = 1; // var1 equaled zero so change var1 to equal one instead
    $var3 = ($var2 / $var1); // divide var1/var2 ie. 1/1
} else {
    $var3 = ($var2 / $var1); // if var1 does not equal zero, divide
}

Perguntas relacionadas:


Definir como 1 se fosse 0 interromperá o erro, mas isso é realmente melhor do que a supressão que você disse que não deve ser usada (com a qual concordo)? Eu sugiro que na maioria das vezes seria provável que alguma outra mensagem ou valor fosse retornado.
James

Neste exemplo, se $var1= = 0, você pode simplesmente definir $var3como $var2. Mesmo não fazendo isso, o resto não é necessário em tudo como a atribuição é a mesma em ambos os casos, de forma que nenhum outro lugar e fora atribuir aif
James

8

Padrões estritos: O método não estático [<class> :: <method>] não deve ser chamado estaticamente

Ocorre quando você tenta chamar um método não estático em uma classe como era estática, e você também tem o E_STRICTsinalizador nas suas error_reporting()configurações.

Exemplo:

class HTML {
   public function br() {
      echo '<br>';
   }
}

HTML::br() ou $html::br()

Você pode realmente evitar esse erro não adicionando E_STRICTa error_reporting(), por exemplo

error_reporting(E_ALL & ~E_STRICT);

já que para o PHP 5.4.0 e superior, E_STRICTestá incluído no E_ALL[ ref ]. Mas isso não é aconselhável. A solução é definir a função estática pretendida como real static:

public static function br() {
  echo '<br>';
}

ou chame a função convencionalmente:

$html = new HTML();
$html->br();

Perguntas relacionadas :


7

Descontinuado: a sintaxe de acesso de deslocamento de matriz e seqüência de caracteres com chaves está obsoleta

Deslocamentos de string e elementos de array podem ser acessados ​​por chaves {}antes do PHP 7.4.0:

$string = 'abc';
echo $string{0};  // a

$array = [1, 2, 3];
echo $array{0};  // 1

Isso está obsoleto desde o PHP 7.4.0 e gera um aviso:

Descontinuado: a sintaxe de acesso de deslocamento de matriz e seqüência de caracteres com chaves está obsoleta

Você deve usar colchetes []para acessar deslocamentos de sequência e elementos de matriz:

$string = 'abc';
echo $string[0];  // a

$array = [1, 2, 3];
echo $array[0];  // 1

O RFC para essa alteração está vinculado a um script PHP que tenta corrigir isso mecanicamente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.