Estou executando um script PHP e continuo recebendo erros como:
Aviso: Variável indefinida: my_variable_name em C: \ wamp \ www \ mypath \ index.php na linha 10
Aviso: Índice indefinido: my_index C: \ wamp \ www \ mypath \ index.php na linha 11
As linhas 10 e 11 são assim:
echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];
Qual é o significado dessas mensagens de erro?
Por que eles aparecem de repente? Eu costumava usar esse script há anos e nunca tive nenhum problema.
Como faço para corrigi-los?
Esta é uma pergunta de referência geral para as pessoas vincularem como duplicadas, em vez de precisar explicar o problema repetidamente. Eu sinto que isso é necessário porque a maioria das respostas do mundo real sobre esse assunto é muito específica.
Meta-discussão relacionada:
and-notice-undef
, apenas uma sugestão para que o URL não seja cortado. Talvez até removendo as (muitas) citações. OuPHP: “Undefined variable/index/offset” notices
and-notice-undef
. Foi apenas uma (poucas) sugestão (s). Apenas se repete também sendoNotice: Undefined
.Respostas:
Aviso: variável indefinida
Da vasta sabedoria do Manual do PHP :
Da documentação do PHP :
Isso significa que você pode usam apenas
empty()
para determinar se a variável é definida, e, além disso, verifica a variável contra o seguinte,0
,0.0
,""
,"0"
,null
,false
ou[]
.Exemplo:
Teste o trecho acima no editor PHP online do 3v4l.org
Embora o PHP não exija uma declaração de variável, ele é recomendado para evitar algumas vulnerabilidades ou bugs de segurança nos quais se esqueça de atribuir um valor a uma variável que será usada posteriormente no script. O que o PHP faz no caso de variáveis não declaradas emite um erro de nível muito baixo
E_NOTICE
, que nem é relatado por padrão, mas o Manual recomenda que isso seja permitido durante o desenvolvimento.Maneiras de lidar com o problema:
Recomendado: declare suas variáveis, por exemplo, quando você tenta anexar uma sequência a uma variável indefinida. Ou use
isset()
/!empty()
para verificar se eles são declarados antes de fazer referência a eles, como em:Isso ficou muito mais limpo a partir do PHP 7.0, agora você pode usar o operador de coalescência nula :
Defina um manipulador de erro personalizado para E_NOTICE e redirecione as mensagens para longe da saída padrão (talvez para um arquivo de log):
Desative E_NOTICE dos relatórios. Uma maneira rápida de excluir apenas
E_NOTICE
é:Suprima o erro com o operador @ .
Nota: é altamente recomendável implementar apenas o ponto 1.
Aviso: Índice indefinido / deslocamento indefinido
Este aviso aparece quando você (ou PHP) tenta acessar um índice indefinido de uma matriz.
Maneiras de lidar com o problema:
Verifique se o índice existe antes de acessá-lo. Para isso, você pode usar
isset()
ouarray_key_exists()
:A construção da linguagem
list()
pode gerar isso quando tenta acessar um índice de matriz que não existe:Duas variáveis são usadas para acessar dois elementos da matriz, no entanto, existe apenas um elemento da matriz, índice
0
, portanto, isso irá gerar:$_POST
/$_GET
/$_SESSION
VariávelOs avisos acima aparecem frequentemente ao trabalhar com
$_POST
,$_GET
ou$_SESSION
. Para$_POST
e$_GET
você apenas precisa verificar se o índice existe ou não antes de usá-los. Para$_SESSION
você ter certeza de que a sessão foi iniciadasession_start()
e que o índice também existe.Observe também que todas as 3 variáveis são superglobais e estão em maiúsculas.
Relacionado:
fonte
@
) apresenta alguns problemas de desempenho. Além disso, como suprime todos os erros dentro de um escopo específico, usá-lo sem cuidado pode mascarar as mensagens que você deseja ter visto.$var = @$_GET['nonexisting'];
ainda causa aviso ..$value = isset($_POST['value']) ? $_POST['value'] : '';
vez de usar 4.$value = @$_POST['value'];
?Tente esse
Ou, como uma solução rápida e suja:
Nota sobre as sessões:
Ao usar sessões,
session_start();
é necessário que seja colocado dentro de todos os arquivos usando sessões.http://php.net/manual/en/features.sessions.php
fonte
E_NOTICE
dophp.ini
arquivo de configuração, façaerror_reporting = (E_ALL & ~E_NOTICE)
Operador de exibição de erro
@
Para avisos indesejados e redundantes, pode-se usar o
@
operador dedicado para ocultar mensagens de índice / variável indefinidas.isset?:
ou??
super-supressão no entanto. Os avisos ainda podem ser registrados. E pode-se ressuscitar@
avisos ocultos com:set_error_handler("var_dump");
if (isset($_POST["shubmit"]))
no seu código inicial.@
ouisset
somente após verificar a funcionalidade.@
é principalmente aceitável para$_GET
/$_POST
parâmetros de entrada, especificamente se eles são opcionais .E como isso abrange a maioria dessas perguntas, vamos expandir as causas mais comuns:
$_GET
/$_POST
/$_REQUEST
entrada indefinidaA primeira coisa que você faz ao encontrar um índice / deslocamento indefinido é verificar erros de digitação:
$count = $_GET["whatnow?"];
Em segundo lugar, se o aviso não tiver uma causa óbvia, use
var_dump
ouprint_r
para verificar todas as matrizes de entrada quanto ao seu conteúdo atual:Ambos irão revelar se o seu script foi chamado com os parâmetros certos ou certos.
Como alternativa ou adicionalmente use o devtools ( F12) do navegador e inspecione a guia de rede em busca de solicitações e parâmetros:
Os parâmetros POST e entrada GET serão mostrados separadamente.
Para
$_GET
parâmetros que você também pode espiada noQUERY_STRING
emO PHP possui algumas regras para agrupar nomes de parâmetros não padrão nos superglobais. O Apache também pode reescrever. Você também pode examinar os
$_COOKIES
cabeçalhos de solicitação HTTP brutos e outros fornecidos dessa maneira.Obviamente, observe os parâmetros GET na barra de endereços do navegador :
http://example.org/script.php?id=5&sort=desc
Os
name=value
pares após o?
ponto de interrogação são os parâmetros da sua consulta (GET). Portanto, esse URL só poderia gerar$_GET["id"]
e$_GET["sort"]
.Por fim, verifique suas declarações
<form>
e<input>
, se você espera um parâmetro, mas não recebe nenhum.<input name=FOO>
id=
outitle=
não é suficiente.method=POST
formulário deve ser preenchido$_POST
.method=GET
(ou deixando de fora) produziria$_GET
variáveis.action=script.php?get=param
via $ _GET e osmethod=POST
campos restantes em $ _POST ao lado.$_REQUEST['vars']
novamente, o que esmaga os parâmetros GET e POST.Se você estiver usando o mod_rewrite, verifique os parâmetros
access.log
e ative osRewriteLog
parâmetros ausentes.$_FILES
$_FILES["formname"]
.enctype=multipart/form-data
method=POST
na sua<form>
declaração.$_COOKIE
$_COOKIE
matriz nunca é preenchida logo apóssetcookie()
, mas apenas em qualquer solicitação HTTP de acompanhamento.fonte
Geralmente por causa de "programação ruim" e possibilidade de erros agora ou mais tarde.
if (isset($varname))
antes de usá-lofonte
Isso significa que você está testando, avaliando ou imprimindo uma variável à qual ainda não atribuiu nada. Isso significa que você tem um erro de digitação ou precisa verificar se a variável foi inicializada para algo primeiro. Verifique seus caminhos lógicos, eles podem estar definidos em um caminho, mas não em outro.
fonte
Não queria desativar o aviso porque é útil, mas queria evitar muita digitação.
Minha solução foi esta função:
Então, se eu quiser fazer referência a $ name e eco, se existir, simplesmente escrevo:
Para elementos da matriz:
Na página, se eu quiser me referir a $ _REQUEST ['name']:
fonte
$foo = "BABAR"; ifexists('foo');
, em geral, retornará nulo. (Os itálicos são capítulos do php.net.)if( !empty($user) and !empty($location) ) echo "hello $user ..."
A melhor maneira de obter a string de entrada é:
Esse one-liner é quase equivalente a:
Se você deseja absolutamente um valor de string , assim como:
fonte
É porque a variável '$ user_location' não está sendo definida. Se você estiver usando um loop if dentro do qual está declarando a variável '$ user_location', também deverá ter um loop else e definir o mesmo. Por exemplo:
O código acima criará um erro como O loop if não é satisfeito e no loop else '$ user_location' não foi definido. Ainda foi solicitado ao PHP que ecoasse a variável. Portanto, para modificar o código, você deve fazer o seguinte:
fonte
Em resposta a "" Por que eles aparecem de repente? Eu costumava usar esse script há anos e nunca tive nenhum problema. "
É muito comum a maioria dos sites operar sob o relatório de erro "padrão" de "Mostrar todos os erros, mas não 'avisos' e 'obsoletos'". Isso será definido no php.ini e será aplicado a todos os sites no servidor. Isso significa que os "avisos" usados nos exemplos serão suprimidos (ocultos), enquanto outros erros, considerados mais críticos, serão mostrados / registrados.
A outra configuração crítica é que os erros podem ser ocultos (ou seja,
display_errors
definidos como "off" ou "syslog").O que aconteceu neste caso é que o
error_reporting
foi alterado para também mostrar avisos (conforme exemplos) e / ou que as configurações foram alteradas paradisplay_errors
na tela (em vez de suprimi-las / registrá-las).Por que eles mudaram?
A resposta óbvia / mais simples é que alguém ajustou uma dessas configurações no php.ini ou uma versão atualizada do PHP agora está usando um php.ini diferente de antes. Esse é o primeiro lugar para procurar.
No entanto, também é possível substituir essas configurações em
e qualquer um desses também poderia ter sido alterado.
Há também a complicação adicional de que a configuração do servidor da web pode ativar / desativar as diretivas .htaccess, portanto, se você tiver diretivas no .htaccess que de repente iniciem / parem de funcionar, será necessário verificar isso.
(.htconf / .htaccess supõe que você esteja executando como apache. Se a linha de comando não estiver sendo aplicada, se estiver executando o IIS ou outro servidor da Web, será necessário verificar essas configurações de acordo)
Sumário
error_reporting
edisplay_errors
php no php.ini não foram alteradas ou você não está usando um php.ini diferente de antes.error_reporting
edisplay_errors
php no .htconf (ou vhosts etc.) não foram alteradaserror_reporting
edisplay_errors
php em .htaccess não foram alteradaserror_reporting
edisplay_errors
php foram definidas lá.fonte
a solução rápida é atribuir sua variável a null na parte superior do seu código
fonte
Eu costumava amaldiçoar esse erro, mas pode ser útil lembrá-lo de como escapar da entrada do usuário.
Por exemplo, se você achou que era um código inteligente, abreviado:
...Pense de novo! Uma solução melhor é:
(Eu uso uma
html()
função personalizada para escapar de caracteres, sua milhagem pode variar)fonte
Agora, no PHP 7.0, é possível usar o operador coalescente nulo:
Igual a:
Manual do PHP PHP 7.0
fonte
if (is_array($my_array['idontexist'] ?? '')) { dosomething(); }
isset()
se você passais_array()
- que é um comportamento booleano e inesperado.Eu uso todo o tempo própria função útil exst () que declara automaticamente variáveis.
Seu código será -
fonte
Em uma linguagem muito simples .
O erro é que você está usando uma variável
$user_location
que não foi definida por você anteriormente e que não tem nenhum valor. Portanto, recomendo que você declare essa variável antes de usá- la. Por exemplo:$user_location = '';
Ou
$user_location = 'Los Angles';
Este é um erro muito comum que você pode enfrentar. Portanto, não se preocupe, basta declarar a variável e Apreciar codificação .
fonte
por que não manter as coisas simples?
fonte
POR QUE ISSO ESTÁ ACONTECENDO?
Com o tempo, o PHP se tornou uma linguagem mais focada na segurança. As configurações que costumavam ser desativadas por padrão agora estão ativadas por padrão. Um exemplo perfeito disso é
E_STRICT
, que foi ativado por padrão a partir do PHP 5.4.0 .Além disso, de acordo com a documentação do PHP, por padrão,
E_NOTICE
está desativado no php.ini. Os documentos do PHP recomendam ativá-lo para fins de depuração . No entanto, quando faço o download do PHP no repositório Ubuntu - e na pilha do BitNami no Windows - vejo outra coisa.Observe que,
error_reporting
na verdade, está definido como o valor da produção por padrão, e não como o valor "padrão" por padrão. Isso é um pouco confuso e não está documentado fora do php.ini, por isso não validei isso em outras distribuições.Para responder sua pergunta, no entanto, esse erro é exibido agora quando não era exibido antes porque:
Você instalou o PHP e as novas configurações padrão estão um pouco mal documentadas, mas não as excluem
E_NOTICE
.E_NOTICE
avisos como variáveis indefinidas e índices indefinidos realmente ajudam a tornar seu código mais limpo e seguro. Posso dizer-lhe que, anos atrás, manterE_NOTICE
ativado me forçou a declarar minhas variáveis. Tornou muito mais fácil aprender C, não declarar variáveis é muito maior do que um incômodo.O QUE POSSO FAZER SOBRE ISSO?
Desative
E_NOTICE
copiando o "Valor padrão"E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
e substituindo-o pelo que atualmente não é comentado após a entrada de iguaiserror_reporting =
. Reinicie o Apache ou PHP se estiver usando CGI ou FPM. Certifique-se de editar o php.ini "certo". O correto será o Apache se você estiver executando o PHP com Apache, fpm ou php-fpm se estiver executando o PHP-FPM, cgi se estiver executando o PHP-CGI, etc. Este não é o método recomendado, mas se você tiver um código legado ser extremamente difícil de editar, pode ser sua melhor aposta.Desative
E_NOTICE
o nível de arquivo ou pasta. Isso pode ser preferível se você tiver algum código legado, mas desejar fazer as coisas da maneira "certa", caso contrário. Para fazer isso, você deve consultar o Apache2, o Nginx ou qualquer que seja o servidor de sua escolha. No Apache, você usariaphp_value
dentro do<Directory>
.Reescreva seu código para ficar mais limpo. Se você precisar fazer isso enquanto estiver migrando para um ambiente de produção ou não quiser que alguém veja seus erros, verifique se está desabilitando qualquer exibição de erros e registrando apenas seus erros (consulte
display_errors
elog_errors
em php.ini e configurações do servidor) .Para expandir a opção 3: este é o ideal. Se você pode seguir este caminho, você deve. Se você não seguir esta rota inicialmente, considere mover essa rota eventualmente testando seu código em um ambiente de desenvolvimento. Enquanto você está nisso, livre-se
~E_STRICT
e~E_DEPRECATED
veja o que pode dar errado no futuro. Você verá muitos erros desconhecidos, mas impedirá que você tenha problemas desagradáveis quando precisar atualizar o PHP no futuro.O QUE SIGNIFICA ERROS?
Undefined variable: my_variable_name
- Isso ocorre quando uma variável não foi definida antes do uso. Quando o script PHP é executado, internamente, apenas assume um valor nulo. No entanto, em qual cenário você precisaria verificar uma variável antes de ser definida? Por fim, esse é um argumento para "código desleixado". Como desenvolvedor, posso dizer que adoro quando vejo um projeto de código aberto no qual as variáveis são definidas no escopo mais alto possível. Isso facilita a identificação de quais variáveis serão exibidas no futuro e a leitura / aprendizagem do código.Undefined index: my_index
- Isso ocorre quando você tenta acessar um valor em uma matriz e ele não existe. Para evitar esse erro, execute uma verificação condicional.Outra opção é declarar uma matriz vazia na parte superior da sua função. Isto nem sempre é possível.
(dica adicional)
vim
pessoa :).fonte
índice indefinido significa em uma matriz que você solicitou o índice de matriz indisponível, por exemplo
variável indefinida significa que você usou uma variável completamente inexistente ou que não está definida ou inicializada com esse nome, por exemplo
deslocamento indefinido significa na matriz que você solicitou uma chave inexistente. E a solução para isso é verificar antes de usar
fonte
Em relação a esta parte da pergunta:
Não há respostas definidas, mas aqui estão algumas explicações possíveis de por que as configurações podem mudar "repentinamente":
Você atualizou o PHP para uma versão mais recente que pode ter outros padrões para reportagem de erros, display_errors ou outras configurações relevantes.
Você removeu ou introduziu algum código (possivelmente em uma dependência) que define configurações relevantes em tempo de execução usando
ini_set()
ouerror_reporting()
(procure-as no código)Você alterou a configuração do servidor da web (assumindo o apache aqui): as
.htaccess
configurações de arquivos e vhost também podem manipular as configurações de php.Normalmente, os avisos não são exibidos / relatados (consulte o manual do PHP ), portanto, é possível que, ao configurar o servidor, o arquivo php.ini não possa ser carregado por algum motivo (permissões de arquivo ??) e você estivesse nas configurações padrão . Posteriormente, o 'bug' foi resolvido (por acidente) e agora pode carregar o arquivo php.ini correto com o error_reporting definido para mostrar avisos.
fonte
Se estiver trabalhando com classes, certifique-se de referenciar variáveis de membro usando
$this
:fonte
Outro motivo pelo qual um aviso de índice indefinido será lançado é que uma coluna foi omitida de uma consulta ao banco de dados.
Ou seja:
Em seguida, tentando acessar mais colunas / linhas dentro de um loop.
Ou seja:
ou em um
while
loop:Outra coisa que precisa ser notada é que, em um * NIX OS e Mac OS X, as coisas diferenciam maiúsculas de minúsculas.
Consulte as seguintes perguntas e respostas na pilha:
Os nomes de tabela no MySQL diferenciam maiúsculas de minúsculas?
nomes de tabelas que diferenciam maiúsculas de minúsculas em consultas
MySql - Emissão sensível a maiúsculas e minúsculas de tabelas em diferentes servidores
fonte
O uso de um ternário é simples, legível e limpo:
Antes do PHP 7
Atribua uma variável ao valor de outra variável, se estiver configurada; caso contrário, atribua
null
(ou qualquervalor padrão que você precise):PHP 7+
O mesmo, exceto usando o Null Coalescing Operator . Não há mais a necessidade de chamar,
isset()
pois isso é incorporado e não é necessário fornecer a variável para retornar, pois supõe-se que retorne o valor da variável que está sendo verificada:Ambos interromperão os avisos da pergunta OP e ambos são o equivalente exato de:
Se você não precisar definir uma nova variável, poderá usar diretamente o valor retornado do ternário, como com
echo
, argumentos de função, etc:Eco:
Função:
O exemplo acima funcionará da mesma forma com matrizes, incluindo sessões, etc., substituindo a variável que está sendo verificada por, por exemplo:
$_SESSION['checkMe']
ou com quantos níveis de profundidade você precisar, por exemplo:
$clients['personal']['address']['postcode']
Supressão:
É possível suprimir o PHP Notices com
@
ou reduzir seu nível de relatório de erros, mas não corrige o problema , simplesmente impede que ele seja relatado no log de erros. Isso significa que seu código ainda tentou usar uma variável que não foi definida, o que pode ou não significar que algo não funciona conforme o esperado - dependendo da importância do valor ausente.Você realmente deve verificar esse problema e resolvê-lo adequadamente, exibindo uma mensagem diferente ou apenas retornando um valor nulo para todo o resto para identificar o estado preciso.
Se você apenas se preocupa com o fato de o Aviso não estar no log de erros, como opção, você pode simplesmente ignorar o log de erros.
fonte
Uma causa comum de uma variável que não existe após o envio de um formulário HTML é o elemento do formulário que não está contido em uma
<form>
tag:Exemplo: Elemento não contido dentro do
<form>
Exemplo: Elemento agora contido no diretório
<form>
fonte
Provavelmente você estava usando a versão antiga do PHP até o momento e agora o PHP atualizado é a razão pela qual ele estava funcionando sem nenhum erro até agora de anos. até o PHP4 não havia erro se você estiver usando a variável sem defini-la, mas a partir do PHP5 em diante ele gera erros para códigos como os mencionados na pergunta.
fonte
Ao lidar com arquivos, são necessários um tipo de codificação adequado e um método POST, que acionará um aviso de índice indefinido se um deles não estiver incluído no formulário.
O manual declara a seguinte sintaxe básica:
HTML
PHP
Referência:
fonte
Fiz uma pergunta sobre isso e fui encaminhado para este post com a mensagem:
Estou compartilhando minha pergunta e solução aqui:
Este é o erro:
A linha 154 é o problema. Isto é o que tenho na linha 154:
Eu acho que o problema é que eu estou escrevendo, se as condições para a variável
$city
, que não é a chave, mas o valor$key => $city
. Primeiro, você pode confirmar se essa é a causa do aviso? Segundo, se esse é o problema, por que não consigo escrever uma condição com base no valor? Tem que ser com a chave que eu preciso para escrever a condição?ATUALIZAÇÃO 1: O problema é que, ao executar
$citiesCounterArray[$key]
, às vezes$key
corresponde a uma chave que não existe na$citiesCounterArray
matriz, mas esse nem sempre é o caso com base nos dados do meu loop. O que eu preciso é definir uma condição para que, se$key
existir na matriz, execute o código, caso contrário, ignore-o.ATUALIZAÇÃO 2: Foi assim que eu o corrigi usando
array_key_exists()
:fonte
Esses erros ocorrem sempre que estamos usando uma variável que não está definida.
A melhor maneira de lidar com isso é definir o relatório de erros durante o desenvolvimento.
Para definir o relatório de erros em:
Nos servidores de produção, o relatório de erros está desativado; portanto, não obtemos esses erros.
No servidor de desenvolvimento, no entanto, podemos definir o relatório de erros.
Para se livrar desse erro, vemos o seguinte exemplo:
Podemos inicializar as variáveis
NULL
antes de atribuir seus valores ou usá-los.Portanto, podemos modificar o código como:
Isso não perturbará nenhuma lógica do programa e não produzirá aviso, mesmo
$test
que não tenha valor.Então, basicamente, é sempre melhor ativar o relatório de erros para desenvolvimento.
E corrija todos os erros.
E na produção, o relatório de erros deve estar desativado.
fonte
Esses avisos são porque você não possui a variável usada
defined
e amy_index
chave não estava presente na$my_array
variável.Esses avisos eram acionados toda vez, porque seu
code
não está correto, mas provavelmente você não tinha o relatório de avisos .Resolva os erros:
Outra maneira de fazer isso:
fonte
No PHP, você precisa primeiro definir a variável depois que você pode usá-la.
Podemos verificar se a variável está definida ou não de maneira muito eficiente!
Explicação Simples
fonte