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
- Nada é visto. A página está vazia e branca. (também conhecido como White Page / Screen Of Death )
- O código não é executado / o que parece ser parte do meu código PHP é gerado
- Aviso: Não é possível modificar as informações do cabeçalho - os cabeçalhos já enviados
- Aviso: mysql_fetch_array () espera que o parâmetro 1 seja um recurso, dado booleano, também conhecido como
Aviso: mysql_fetch_array (): o argumento fornecido não é um recurso de resultado válido do MySQL, também conhecido como
Aviso: mysqli_num_rows () espera que o parâmetro 1 seja mysqli_result, dado booleano (ou variações similares) - Aviso: [função] espera que o parâmetro 1 seja um recurso, dado booleano
- Aviso: [função] : falha ao abrir o fluxo: [motivo]
- Aviso: restrição open_basedir em vigor
- Aviso: Divisão por zero
- Aviso: deslocamento ilegal de cadeia 'XXX'
- Aviso: count (): o parâmetro deve ser uma matriz ou um objeto que implemente Countable
- Erro de análise: erro de sintaxe, inesperado '['
- Erro de análise: erro de sintaxe, T_XXX inesperado
- Erro de análise: erro de sintaxe, inesperado T_ENCAPSED_AND_WHITESPACE
- Erro de análise: erro de sintaxe, inesperado T_PAAMAYIM_NEKUDOTAYIM
- Erro de análise: erro de sintaxe, inesperado 'require_once' (T_REQUIRE_ONCE), função de espera (T_FUNCTION)
- Erro de análise: erro de sintaxe, inesperado T_VARIABLE
- Erro fatal: esgotado o tamanho da memória de XXX bytes (tentou alocar XXX bytes)
- Erro fatal: chamar uma função de membro ... em um não-objeto ou nulo
- Erro fatal: Chamada para a função indefinida XXX
- Erro fatal: não é possível redeclarar XXX
- Erro fatal: não é possível usar o valor de retorno da função no contexto de gravação
- Erro fatal: a declaração de AAA :: BBB () deve ser compatível com a de CCC :: BBB () '
- Erro fatal: usar $ this quando não estiver no contexto do objeto
- Erro fatal: O objeto da classe Closure não pôde ser convertido em string
- Erro fatal: constante de classe indefinida
- Aviso: conversão de matriz para string
- Aviso: Tentando obter propriedade de erro não-objeto
- Aviso: variável ou propriedade indefinida
- Aviso: Índice Indefinido
- Aviso: deslocamento indefinido XXX [Referência]
- Aviso: deslocamento de cadeia não inicializado: XXX
- Aviso: Uso da constante indefinida XXX - assumida 'XXX'
- 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 ...
- Padrões estritos: O método não estático [<class> :: <method>] não deve ser chamado estaticamente
- Atenção: a função espera que o parâmetro X seja booleano / string / inteiro
- Erro HTTP 500 - Erro interno do servidor
- Descontinuado: a sintaxe de acesso de deslocamento de matriz e seqüência de caracteres com chaves está obsoleta
Veja também:
Respostas:
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_WARNING
e não irá parar o script.Um exemplo típico seria um arquivo de modelo como este:
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 osession_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<?php
tem 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:
fonte
<?php ?>
e, portanto, "mais de um bloco" seria<?php ?> <?php ?>
?Erro fatal: chamar uma função de membro ... em um não-objeto
Ocorre com código semelhante ao local
xyz->method()
ondexyz
não é um objeto e, portanto,method
nã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
No exemplo acima, a consulta não pode ser preparada e
prepare()
será atribuídafalse
a$statement
. Tentar chamar oexecute()
método resultará no Erro Fatal porquefalse
é 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
$pdo
objeto 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
->prepare
estiver falhando, o$pdo
objeto 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
Ao tentar executar o método fora do bloco condicional, seu objeto pode não estar definido.
Perguntas relacionadas:
fonte
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/apache2
em 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:
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 adisplay_startup_errors
diretiva paratrue
. Faça isso nophp.ini
ou em um.htaccess
ou 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:
fonte
error_reporting(~0);
por que não-1
? É isso que~0
avalia e é muito menos enigmático.~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ário1111'1111'1111'1111
(para 32 bits).1111'1111'1111'1111
são realmente 16 bits, mas espero que você entenda o que quero dizer.E_STRICT
não está incluído noE_ALL
. php.net/manual/en/errorfunc.constants.php e role para baixo atéE_STRICT
.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 Index
aviso seria ( demo )Ambos
spinach
e1
não existem na matriz, fazendo com que umE_NOTICE
seja 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_exists
ouisset
:Se você tiver um código como:
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:Perguntas relacionadas:
fonte
if(!empty($_POST['message'])){ //do stuff }
Atenção: mysql_fetch_array () espera que o parâmetro 1 seja um recurso, dado booleano
Em primeiro lugar:
Isso acontece quando você tenta buscar dados do resultado,
mysql_query
mas 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_query
porPerguntas 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.fonte
mysql_query
não for ruim o suficiente, adicionaror die
mais insultos à lesão.$res = mysql_query($query)
retornará 1 se a consulta for bem-sucedida e, portanto, for considerada verdadeira. Portanto, ao passar o resultado demysql_query
paramysql_fetch_array()
o aviso mostra.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?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).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:
Se um método não estático for chamado estaticamente. Exemplo:
Como corrigir: revise seu código novamente,
$this
só 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_property
para acessar a propriedade estática.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
$this
variável especial.Como corrigir: revise o código e substitua
$this
por uma variável de substituição diferente.Perguntas relacionadas:
fonte
$closure = function() { self::method(); }
.$this
você pode acionar o "Erro fatal: usando $ this quando não estiver no contexto do objeto" :$closure = function() { $this->method(); };
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
Nesse caso,
fn()
nunca será declarado porque$someCondition
não é verdade.Exemplo 2 - Função na declaração de função
Nesse caso,
fn
será declarado apenas quandocreateFn()
for chamado. Observe que as chamadas subsequentes paracreateFn()
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,
apt
no Debian ou Ubuntu,yum
no 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:
fonte
Erro de análise: erro de sintaxe, T_XXX inesperado
Acontece quando você tem um
T_XXX
token 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:
fonte
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:
Isso ocorre porque,
empty
como 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 argumentoempty()
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 (comois_null(null)
no exemplo) sempre serão consideradas existentes, portanto, aquiempty
só é verificado se é igual a falso. Você pode substituirempty()
aqui por!
, por exemploif (!is_null(null))
, ou comparar explicitamente com falso, por exemploif (is_null(null) == false)
.Perguntas relacionadas:
fonte
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"):
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?
$query
vai acabar com: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:
mysql_real_escape_string()
mysqli_real_escape_string()
fonte
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.ini
arquivo ou usandoini_set('memory_limit', '128 M');
o script (que substituirá o valor definido emphp.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_usage
função é sua amiga.Perguntas relacionadas:
fonte
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
: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:Toda a variável e chave (s) complexa (s) da matriz podem ser incluídas
{}
, caso em que devem ser citadas para evitar umE_NOTICE
. A documentação do PHP recomenda esta sintaxe para variáveis complexas.Obviamente, a alternativa a qualquer uma das opções acima é concatenar a variável da matriz em vez de interpolá-la:
Para referência, consulte a seção Análise de Variáveis na página de manual do PHP Strings
fonte
Aviso: [função] : falha ao abrir o fluxo: [motivo]
Isso acontece quando você chama um arquivo normalmente por
include
,require
oufopen
e 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:
Um erro comum é não usar um caminho absoluto. Isso pode ser facilmente resolvido usando um caminho completo ou constantes mágicas como
__DIR__
oudirname(__FILE__)
:ou:
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:
fonte
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:
fonte
a()::b;
ou$a=::;
.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:
Outra causa comum é um
$
sinal ausente (dólar) na frente de um nome de variável:Ou talvez você tenha escrito incorretamente outra constante ou palavra-chave:
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:
fonte
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
require
ouinclude
onde deveria usarrequire_once
ouinclude_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
index.php
A segunda chamada para
do_stuff()
produzirá o erro acima. Ao mudarrequire
pararequire_once
, podemos ter certeza de que o arquivo que contém a definição deMyClass
será carregado apenas uma vez e o erro será evitado.fonte
Aviso: variável indefinida
Acontece quando você tenta usar uma variável que não foi definida anteriormente.
Um exemplo típico seria
Se você não definiu
$counter
antes, 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
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
counter
propriedade não foi definida.Perguntas relacionadas:
fonte
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:
O que estou tentando
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
. EssaT_VARIABLE
coisa é chamada detoken
. É 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á umT_VARIABLE
token na lista do intérprete.Boa leitura: lista de tokens do analisador
Portanto, certifique-se de ativar pelo menos o
E_PARSE
seuphp.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:
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:
Perguntas relacionadas:
fonte
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
O exemplo acima irá gerar ( demonstração online ):
E, assim que o script terminar de eco,
D
você 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 contar0
e ecoaD
no momento em que atinge4
, gera um erro de deslocamento.Erros semelhantes:
fonte
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
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
NULL
se 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 :
O problema é acessar a
nodeValue
propriedade (campo) do primeiro item enquanto ele não foi verificado se existe ou não na$result
coleçã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:Erros relacionados:
fonte
json_decode
agora retorna uma instânciastdclass
por padrão, então o código de exemplo seria realmente funcionar.json_decode
agora retorna uma instânciastdclass
por padrão" ? Não consigo encontrar isso no changelog.assoc
parâmetro está definido como false. Este parâmetro decide se a função retornará umastdclass
matriz em vez de uma matriz associativa.json_decode('[{"name": "hakre"}]', true)
retornará uma matriz, de outro modo umstdclass
objectoAviso: 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 é chamada
open_basedir
.Às vezes, os nomes de arquivos ou diretórios incorretos são usados, a correção é usar os corretos.
Perguntas relacionadas:
fonte
Erro de análise: erro de sintaxe, inesperado '['
Este erro ocorre em duas variáveis:
Variação 1
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:
Veja também este exemplo no manual.
Variação 2
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):
Veja também este exemplo no manual.
fonte
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 :
A extensão cURL define outros dois tipos de recursos :
Quando
var_dump
editados, os valores são assim: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, afopen
função tem esta descrição:Portanto, neste código,
$fp
será umresource(x) of type (stream)
oufalse
:Se você não verificar se a
fopen
operação foi bem-sucedida ou falhou e, portanto, se$fp
é um recurso válido ou sefalse
passa$fp
para outra função que espera um recurso, você pode obter o erro acima:Você sempre precisa verificar o valor de retorno das funções que estão tentando alocar um recurso e podem falhar :
Erros relacionados:
fonte
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:
Se você acha que a variável deve ser uma matriz, veja de onde ela vem e corrija o problema.
fonte
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:
* 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:
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:
Você também pode querer verificar se está usando tags abertas curtas em
<?
vez de<?php
e 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
fonte
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
$username
e$password
.(using password: NO)
.Somente o servidor de teste local geralmente permite a conexão com nome de usuário
root
, sem senha e com otest
nome 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_USER
ouDB_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.php
foi realmente incluído e o que mais.Verifique as
GRANT
permissõ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_query
chamadas, se você não tiver permissões paraSELECT
uma tabela específica ouINSERT
/UPDATE
e, mais comumente,DELETE
qualquer 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=
emysql.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:
por exemplo, HostGator , GoDaddy , 1and1 , DigitalOcean , BlueHost , DreamHost , MediaTemple , IXWebhosting , lunarhosting , ou apenas google yours'.
Caso contrário, consulte o seu provedor de hospedagem através dos canais de suporte.
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:
fonte
Aviso: conversão de matriz para string
Isso simplesmente acontece se você tentar tratar uma matriz como uma string:
Uma matriz não pode simplesmente ser
echo
concatenada 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:Ou faça um loop na matriz:
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.
fonte
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:
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.
Perguntas relacionadas:
fonte
$var1
= = 0, você pode simplesmente definir$var3
como$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
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_STRICT
sinalizador nas suaserror_reporting()
configurações.Exemplo:
HTML::br()
ou$html::br()
Você pode realmente evitar esse erro não adicionando
E_STRICT
aerror_reporting()
, por exemplojá que para o PHP 5.4.0 e superior,
E_STRICT
está incluído noE_ALL
[ ref ]. Mas isso não é aconselhável. A solução é definir a função estática pretendida como realstatic
:ou chame a função convencionalmente:
Perguntas relacionadas :
fonte
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:Isso está obsoleto desde o PHP 7.4.0 e gera um aviso:
Você deve usar colchetes
[]
para acessar deslocamentos de sequência e elementos de matriz:O RFC para essa alteração está vinculado a um script PHP que tenta corrigir isso mecanicamente.
fonte