web-dev-qa-db-fra.com

Que signifie le message d'erreur PHP "Avis: utilisation d'une constante non définie"?

PHP écrit cette erreur dans les journaux: "Avis: Utilisation d'une constante non définie".

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 cela signifie et pourquoi je le vois?

147
Nik

Vous devriez citer vos clés de tableau:

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

Tel quel, il cherchait des constantes appelées department, name, email, message, etc. S'il ne trouve pas une telle constante, PHP (bizarrement) l'interprète comme une chaîne ('department', etc.). Évidemment, cela peut facilement casser si vous définissez une telle constante plus tard (bien que ce soit un mauvais style d'avoir des constantes minuscules).

203
Matthew Flaschen

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

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

$_POST[department]

La syntaxe valide dans PHP n'est valide que s'il existait auparavant une constante department définie. Donc, malheureusement, plutôt que de mourir avec une erreur Fatal à 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 fondamentale: un jeton qui pourrait être une constante.

Chaînes manquantes: $my_array[bad_key]

C’est le problème qui se pose 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. La réparation des clés de chaîne corrigera le bogue:

Changement:

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

À:

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

Signe dollar manquant: var_without_dollar

Une autre raison pour laquelle vous pouvez voir ce message d'erreur est si vous laissez le $ d'une variable ou $this-> d'un membre. Par exemple, l’un des éléments suivants provoquerait 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

Si vous essayez d'utiliser un caractère non autorisé dans un nom de variable, un tiret (-) au lieu d'un trait de soulignement _ pourrait être un cas courant.

Par exemple, c’est bien, puisque les caractères de soulignement sont autorisés dans les noms de variables :

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

Mais ce n'est pas:

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

Ce sera interprété comme ceci:

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

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

Pour faire référence à une constante de classe, vous devez spécifier la portée de la classe avec ::. Si vous ratez cette opération, PHP pensera que vous parlez d'une define() globale.

Par exemple:

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

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

Certaines constantes définies par le système n'existent que dans les versions les plus récentes de PHP, par exemple les constantes d'option de mode pour round() telles que PHP_ROUND_HALF_DOWN n'existent que dans PHP 5.3 ou plus tard.

Donc, si vous avez essayé d'utiliser cette fonctionnalité dans PHP 5.2, dites:

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

Vous obtiendrez ce message d'erreur:

Utilisation de la constante non définie PHP_ROUND_HALF_DOWN - supposée 'PHP_ROUND_HALF_DOWN' Avertissement (2): Nombre de paramètres incorrect pour round ()

73
John Carter

vous avez probablement oublié d'utiliser "".

Par exemple:

$_array[text] = $_var;

changer à:

$_array["text"] = $_var;
6
Giancarlo

Vous avez oublié de mettre des guillemets simples autour de vos clés de tableau:

$ _POST [email]

devrait être:

$ _POST ['email']

2
Ahmed Al-hajri

Insérer des guillemets simples.

Exemple

$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']); 
1
Hackbal Teamz
<?php 
  ${test}="test information";
  echo $test;
?>

Avis: Utilisation de test constant non défini - supposé 'test' dans D:\xampp\htdocs\sp\test\envoirnmentVariables.php sur les informations de test de la ligne 3

1

La manière correcte d’utiliser les variables post est la suivante:

<?php

$department = $_POST['department'];

?>

Utiliser une seule citation (')

1
Srihari Goud

Je ne suis pas sûr qu'il y ait une différence. J'utilise un code allumeur et j'utilise "" pour les noms et cela fonctionne très bien.

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

cordialement,

Jorge.

0

On dirait que les constantes de recherche prédéfinies ont disparu avec l'extension MySQL, nous devons donc les ajouter avant la première fonction ...

// constantes d'extraction prédéfinies

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

J'ai testé et réussi.

0
Venkat