Que signifie le message D'erreur PHP "noter: Utilisation d'une constante non définie"?

PHP écrit cette erreur dans les logs: "Notice: Utilisation de constante non définie".

erreur dans les 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)

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

Que signifie et pourquoi suis-je le voir?

133
demandé sur hakre 2010-05-31 07:07:15

9 réponses

vous devez 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. Quand il ne trouve pas une telle constante, PHP (bizarrement) l'interprète comme une chaîne de caractères ('département', etc). Évidemment, cela peut facilement se casser si vous définissez une telle constante plus tard (bien que ce soit un mauvais style d'avoir des constantes minuscules).

185
répondu Matthew Flaschen 2017-07-14 06:12:11

le message d'erreur est dû au fait malheureux que PHP déclarera implicitement un token inconnu comme 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 valable pour que ce soit une syntaxe valide en PHP est s'il y avait auparavant une constante department définie. Donc 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');  

il y a plusieurs façons d'obtenir ce message d'erreur, mais elles ont toutes la même cause racine - un jeton qui pourrait être une constante.

chaînes de caractères guillemets manquants: $my_array[bad_key]

C'est ce que le problème est dans votre cas, et c'est parce que vous avez des clés string array qui n'ont pas été citées. Fixer les touches string corrigeront le bug:

changement:

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

à:

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

Variable manquante signe dollar: var_without_dollar

une autre raison pour laquelle vous pourriez voir ce message d'erreur est si vous quittez le $ d'une variable, ou $this-> d'un membre. Par exemple, l'un ou l'autre des éléments suivants causerait un message d'erreur similaire:

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

invalide caractère dans le nom de la variable: $bad-variable-name

un problème similaire mais plus subtil peut se produire si vous essayez d'utiliser un caractère refusé dans un nom de variable - un trait d'Union ( - ) au lieu d'un soulignement _ serait un cas courant.

par exemple, C'est OK, puisque souligne 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();
}

il sera interprété comme ceci:

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

se référant à 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 classe avec :: , si vous ne le faites pas 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
  }
}

en utilisant une constante qui n'est pas définie dans cette version de PHP, ou est défini dans une extension qui n'est pas installé

il existe certaines constantes définies par le système qui n'existent que dans les versions plus récentes de PHP, par exemple les constantes d'option de mode pour round() telles que PHP_ROUND_HALF_DOWN n'existent qu'en 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 obtiendriez ce message d'erreur:

utilisation de la constante non définie PHP_ROUND_HALF_DOWN-assumed 'PHP_ROUND_HALF_DOWN' Warning (2): Wrong parameter count for round ()

67
répondu John Carter 2011-11-06 06:54:52

vous avez probablement oublié d'utiliser "" .

par exemple:

$_array[text] = $_var;

changer pour:

$_array["text"] = $_var;
6
répondu Giancarlo 2016-05-30 15:11:05

la façon correcte d'utiliser les variables de poste est

<?php

$department = $_POST['department'];

?>

use simple quotation (')

1
répondu Srihari Goud 2012-11-10 05:37:56
<?php 
  ${test}="test information";
  echo $test;
?>

avis: utilisation d'un test constant non défini-hypothèse "test" dans D:\xampp\htdocs\sp\test\envoirnmentVariables.php sur la ligne 3 informations sur l'essai

1
répondu santoshvijaypawar 2015-10-02 07:52:41

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
répondu Hackbal Teamz 2016-10-21 16:07:03

Je ne suis pas sûr qu'il y ait une différence en utilisant le Code igniter 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"]);

concerne",

Jorge.

0
répondu Jorge Vicente Mendoza 2011-08-08 16:28:09

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

$_POST [email]

devrait être:

$_POST ['email']

0
répondu Ahmed Al-hajri 2017-11-28 19:31:26

semble que les constantes prédéfinies de fetch ont disparu avec L'extension MySQL, nous devons donc les ajouter avant la première fonction...

/ / constantes de fetch 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
répondu Venkat 2018-03-21 14:50:09