197 votes

Que signifie le message d'erreur PHP "Notice : Use of undefined constant" (Utilisation d'une constante non définie) ?

PHP écrit cette erreur dans les journaux : "Notice : Use of undefined constant".

Erreur dans les journaux :

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)

Lignes de code pertinentes :

$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]);

Qu'est-ce que ça veut dire et pourquoi je le vois ?

256voto

Matthew Flaschen Points 131723

department est destiné à être un chaîne de caractères (à utiliser ici comme clé de tableau). En PHP, les chaînes de caractères doivent être placées entre guillemets. Dans un passé lointain, PHP était laxiste quant à l'utilisation des guillemets pour les chaînes de caractères d'un seul mot, mais ces jours sont révolus.

Par conséquent, il doit être 'department' o "department" .

Il en va de même pour les autres erreurs.

En l'état, il recherchait des constantes appelées department , name , email , message etc. Lorsqu'il ne trouve pas une telle constante, PHP l'interprète (bizarrement) comme une chaîne de caractères ('département', etc) mais vous en avertit. Évidemment, cela peut facilement être cassé si vous définissez une telle constante plus tard (bien que ce soit un mauvais style d'avoir des constantes en minuscules).

0 votes

Fait-il référence à la variable $_POST ?

1 votes

Il ne se réfère pas spécifiquement au $_POST. La même chose se produirait pour d'autres tableaux associatifs.

3 votes

@Colonel Shrapnel, quand est-ce que j'ai dit sólo Les clés des tableaux doivent-elles être citées ? Il doit effectivement citer les clés, mais pas seulement elles.

94voto

therefromhere Points 21329

Le message d'erreur est dû au fait que PHP déclare implicitement un jeton inconnu comme une chaîne constante du même nom.

C'est-à-dire qu'il essaie d'interpréter ceci (notez les guillemets manquants) :

$_POST[department]

La seule façon valide pour que ce soit une syntaxe valide en PHP est qu'il y avait auparavant une constante department défini. Malheureusement, plutôt que de mourir avec une erreur fatale à ce stade, il émet cet avis et agit comme si une constante avait été définie avec le même nom et la même valeur :

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

Vous pouvez obtenir ce message d'erreur de différentes manières, mais elles ont toutes la même cause première : un jeton qui ne peut pas être utilisé. pourrait soit une constante.

Guillemets manquants sur les cordes : $my_array[bad_key]

C'est là que réside le problème dans votre cas, et c'est parce que vous avez des clés de tableau de chaînes qui n'ont pas été citées. En corrigeant les clés de chaîne, vous corrigerez le problème :

Changez :

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

A :

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

Le signe dollar manque dans la variable : var_without_dollar

Une autre raison pour laquelle vous pouvez voir ce message d'erreur est que si vous n'avez pas ajouté l'option $ à partir d'une variable, ou $this-> d'un membre. Par exemple, l'une ou l'autre des situations suivantes entraînerait un message d'erreur similaire :

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

Caractère non valide dans le nom de la variable : $bad-variable-name

Un problème similaire mais plus subtil peut survenir si vous essayez d'utiliser un caractère non autorisé dans un nom de variable - un trait d'union ( - ) au lieu d'un trait de soulignement _ serait un cas courant.

Par exemple, c'est correct, puisque les underscores sont autorisés dans les noms de variables :

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

Mais ce n'est pas le cas :

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

Ce sera interprété de la même façon que ceci :

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

Référence à une constante de classe sans spécifier la portée de la classe

Afin de faire référence à une constante de classe, vous devez spécifier l'étendue de la classe avec :: Si vous ne le faites pas, PHP pensera que vous parlez d'un système global. define() .

Eg :

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
  }
}

Utilisation d'une constante qui n'est pas définie dans cette version de PHP, ou qui est définie dans une extension qui n'est pas installée.

Il y a des constantes définies par le système qui n'existent que dans les nouvelles versions de PHP, par exemple les constantes de l'option de mode de round() comme PHP_ROUND_HALF_DOWN n'existent qu'en PHP 5.3 ou plus.

Donc si vous essayez d'utiliser cette fonctionnalité en PHP 5.2, disons :

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

Vous obtiendrez ce message d'erreur :

Utilisation de la constante non définie PHP_ROUND_. Avertissement 'PHP_ROUND_HALF_DOWN' (2) : Mauvais nombre de paramètres pour round()

0 votes

Merci de partager. J'ai manqué le self:: partie. Ça marche maintenant.

3 votes

Sans aucun doute, cette réponse est plus complète que les autres et mérite le badge de la meilleure réponse ! J'ai aussi manqué la portée de la classe et j'ai fini par obtenir des informations précieuses pour l'avenir. Merci, John !

7voto

Giancarlo Points 61

Vous avez probablement oublié d'utiliser "" .

Par exemple :

$_array[text] = $_var;

changer pour :

$_array["text"] = $_var;

6voto

Ahmed Al-hajri Points 47

Tu as oublié de mettre des guillemets simples autour des clés de ton tableau :

$_POST[email]

devrait être :

$_POST['email']

1voto

<?php 
  ${test}="test information";
  echo $test;
?>

Avis : Utilisation de la constante non définie test - supposé 'test' dans D:\xampp\htdocs\sp\test\envoirnmentVariables.php o informations sur le test

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X