O que significa a mensagem de erro do PHP "Aviso: Uso de constante indefinida"?

163

O PHP está gravando este erro nos logs: "Aviso: Uso de constante indefinida".

Erro nos logs:

PHP Notice:  Use of undefined constant department - assumed 'department' (line 5)
PHP Notice:  Use of undefined constant name - assumed 'name' (line 6)
PHP Notice:  Use of undefined constant email - assumed 'email' (line 7)
PHP Notice:  Use of undefined constant message - assumed 'message' (line 8)

Linhas de código relevantes:

$department = mysql_real_escape_string($_POST[department]);
$name = mysql_real_escape_string($_POST[name]);
$email = mysql_real_escape_string($_POST[email]);
$message = mysql_real_escape_string($_POST[message]);

O que significa e por que estou vendo?

Nik
fonte

Respostas:

217

Você deve citar suas chaves de matriz:

$department = mysql_real_escape_string($_POST['department']);
$name = mysql_real_escape_string($_POST['name']);
$email = mysql_real_escape_string($_POST['email']);
$message = mysql_real_escape_string($_POST['message']);

Como é, ele estava olhando para constantes chamados department, name, email, message, etc. Quando não encontrar tal constante, PHP (curiosamente) interpreta como uma string ( 'departamento', etc). Obviamente, isso pode ser interrompido facilmente se você definir essa constante posteriormente (embora seja um estilo ruim ter constantes em minúsculas).

Matthew Flaschen
fonte
Está se referindo à variável $ _POST?
Nik
3
@Col. Estilhaços, quando eu disse que apenas as chaves da matriz precisavam ser citadas? Ele precisa citar as chaves, mas não apenas elas.
Matthew Flaschen
1
bem, quero dizer que não há necessidade de citar chaves de matriz . é preciso citar cadeias de caracteres, não chaves de matriz. uma chave não requer citações especiais.
Seu senso comum
4
Não é "bizarro" ... É "compatível com versões anteriores". O PHP originalmente permitido e até promovido usando cadeias não citadas como chaves. (Ok, talvez ele ainda é "bizarro" :-).
Brian White
1
@BrianWhite De fato, ao propor descontinuar essa funcionalidade , não pude encontrar nenhuma evidência de que ela fosse oficialmente incentivada, e apenas as versões beta do PHP 3.0 incluíam o comportamento sem o aviso, por isso parece ser retrocompatível com um recurso que foi nunca lançado. De qualquer forma, ele desaparecerá no PHP 8.0, sempre que aparecer.
IMSOP
77

A mensagem de erro ocorre devido ao fato infeliz de que o PHP declarará implicitamente um token desconhecido como uma sequência constante de mesmo nome.

Ou seja, está tentando interpretar isso (observe as aspas ausentes):

$_POST[department]

A única maneira válida de que isso seria uma sintaxe válida no PHP é se anteriormente havia uma constante departmentdefinida. Por isso, infelizmente, em vez de morrer com um erro fatal neste momento, ele emite este aviso e age como se uma constante tivesse sido definida com o mesmo nome e valor:

// Implicit declaration of constant called department with value 'department'
define('department', 'department');  

Existem várias maneiras de obter essa mensagem de erro, mas todas elas têm a mesma causa raiz - um token que pode ser uma constante.

Citações ausentes: $my_array[bad_key]

Este é o problema no seu caso, e é porque você tem chaves de matriz de string que não foram citadas. A correção das chaves da string corrigirá o erro:

Mudança:

$department = mysql_real_escape_string($_POST[department]);
...(etc)...

Para:

$department = mysql_real_escape_string($_POST['department']);
...(etc)...

Cifrão variável ausente: var_without_dollar

Outro motivo para você ver essa mensagem de erro é se você deixar de fora $de uma variável ou $this->de um membro. Por exemplo, qualquer um dos seguintes itens causaria uma mensagem de erro semelhante:

my_local;   // should be $my_local
my_member;  // should be $this->my_member

Caractere inválido no nome da variável: $bad-variable-name

Um problema semelhante, porém mais sutil, pode resultar se você tentar usar um caractere não permitido em um nome de variável - um hífen ( -) em vez de um sublinhado _seria um caso comum.

Por exemplo, isso está OK, pois sublinhados são permitidos em nomes de variáveis :

if (123 === $my_var) {
  do_something();
}

Mas isso não é:

if (123 === $my-var) {
  do_something();
}

Será interpretado da mesma forma que isto:

if (123 === $my - var) {  // variable $my minus constant 'var'
  do_something();
}

Referindo-se a uma constante de classe sem especificar o escopo da classe

Para se referir a uma constante de classe, você precisa especificar o escopo da classe ::; se você perder isso, o PHP pensará que você está falando de um global define().

Por exemplo:

class MyClass {
  const MY_CONST = 123;

  public function my_method() {
    return self::MY_CONST;  // This is fine
  }


  public function my_method() {
    return MyClass::MY_CONST;  // This is fine
  }

  public function my_bad_method() {
    return MY_CONST;  // BUG - need to specify class scope
  }
}

Usando uma constante que não está definida nesta versão do PHP ou está definida em uma extensão que não está instalada

Existem algumas constantes definidas pelo sistema que existem apenas em versões mais recentes do PHP, por exemplo, as constantes de opção de round()modo que PHP_ROUND_HALF_DOWNexistem apenas no PHP 5.3 ou posterior.

Portanto, se você tentou usar esse recurso no PHP 5.2, diga:

$rounded = round($my_var, 0, PHP_ROUND_HALF_DOWN);

Você receberá esta mensagem de erro:

Uso da constante indefinida PHP_ROUND_HALF_DOWN - assumida 'PHP_ROUND_HALF_DOWN' Aviso (2): Contagem incorreta de parâmetros para round ()

John Carter
fonte
Obrigado por compartilhar. Eu perdi a self::parte. Está funcionando agora.
moreirapontocom
Sem dúvida, esta resposta é mais abrangente que outras e merece o melhor emblema de resposta! Senti muito a falta do escopo da classe e acabei recebendo algumas informações valiosas para o futuro. Obrigado John!
Harish ST
6

você provavelmente esqueceu de usar "".

Por exemplo:

$_array[text] = $_var;

mudar para:

$_array["text"] = $_var;
Giancarlo
fonte
3

Você deixou de colocar aspas simples em torno de suas chaves de matriz:

$ _POST [email]

deveria estar:

$ _POST ['email']

Ahmed Al-hajri
fonte
Deve ser $ _POST ['email'];
Ibnul Quayum
1

A maneira correta de usar variáveis ​​de postagem é

<?php

$department = $_POST['department'];

?>

Use aspas simples (')

Srihari Goud
fonte
1
<?php 
  ${test}="test information";
  echo $test;
?>

Aviso: Uso de teste constante indefinido - assumido 'teste' em D: \ xampp \ htdocs \ sp \ test \ envoirnmentVariables.php na linha 3 informações de teste

santoshvijaypawar
fonte
1

Inserir aspas simples.

Exemplo

$department = mysql_real_escape_string($_POST['department']);
$name = mysql_real_escape_string($_POST['name']);
$email = mysql_real_escape_string($_POST['email']);
$message = mysql_real_escape_string($_POST['message']); 
Hackbal Teamz
fonte
0

Não tenho certeza se existe alguma diferença, estou usando o ignitor de código e "" eu uso os nomes e ele funciona muito bem.

$department = mysql_real_escape_string($_POST["department"]);
$name = mysql_real_escape_string($_POST["name"]);
$email = mysql_real_escape_string($_POST["email"]);
$message = mysql_real_escape_string($_POST["message"]);

Saudações,

Jorge.

Jorge Vicente Mendoza
fonte
1
Não há diferença entre aspas simples e duplas neste caso.
Robbie Averill
1
@RobbieAverill, embora neste caso, de fato, não exista - como as seqüências de citação únicas exibem as coisas como são -, onde as aspas duplas analisam caracteres de escape e avaliam as variáveis, é bom estilo usar sequências de aspas simples nesse cenário.
26415 Frankie
0

Parece que as constantes de busca predefinidas desapareceram com a extensão MySQL, portanto, precisamos adicioná-las antes da primeira função ...

// constantes de busca predefinidas

define('MYSQL_BOTH',MYSQLI_BOTH);
define('MYSQL_NUM',MYSQLI_NUM);
define('MYSQL_ASSOC',MYSQLI_ASSOC);

Eu testei e consegui.

Venkat
fonte