Que signifie le message d'erreur PHP «Remarque: utilisation d'une constante non définie»?

164

PHP est en train d'écrire cette erreur dans les logs: "Remarque: 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 le vois-je?

Nik
la source

Réponses:

218

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

Comme il est, il cherchait des constantes appelées department, name, email, message, etc. Quand il ne l' interprète comme une chaîne ( « département », etc.) PHP () bizarrement pas trouvé une telle constante. É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).

Matthew Flaschen
la source
Fait-il référence à la variable $ _POST?
Nik
3
@Col. Shrapnel, quand ai-je dit que seules les clés de tableau devaient être citées? Il a besoin de citer les clés, mais pas seulement.
Matthew Flaschen
1
bien je veux dire qu'il n'est pas nécessaire de citer les clés du tableau . il faut citer des chaînes, pas des clés de tableau. une clé ne nécessite aucun devis spécial.
Votre bon sens
4
Ce n'est pas "bizarre" ... C'est "rétrocompatible". PHP à l'origine autorisé et même promu en utilisant des chaînes sans guillemets comme clés. (Ok, peut-être que c'est encore "bizarre". :-)
Brian White
1
@BrianWhite Fait amusant, en proposant de désapprouver cette fonctionnalité , je n'ai pu trouver aucune preuve qu'elle ait jamais été officiellement encouragée, et seules les versions bêta de PHP 3.0 incluaient le comportement sans préavis, il semble donc être rétrocompatible avec une fonctionnalité qui était jamais sorti. Quoi qu'il en soit, il disparaîtra dans PHP 8.0, chaque fois que cela se produira.
IMSoP
77

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

Autrement dit, il essaie d'interpréter cela (notez les guillemets manquants):

$_POST[department]

La seule façon valable que cette syntaxe soit valide en PHP est si une constante était précédemment departmentdéfinie. 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 existe plusieurs façons d'obtenir ce message d'erreur, mais elles ont toutes la même cause fondamentale - un jeton qui pourrait être une constante.

Chaînes de guillemets manquants: $my_array[bad_key]

C'est 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. La correction 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 variable: var_without_dollar

Une autre raison pour laquelle vous pouvez voir ce message d'erreur est si vous omettez $de 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

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 tiret ( -) au lieu d'un trait de soulignement _serait un cas courant.

Par exemple, c'est OK, car les traits 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();
}

Cela sera interprété de la même manière:

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 manquez cela, PHP pensera que vous parlez d'un global define().

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 qui 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 plus récentes de PHP, par exemple les constantes d'option de mode pour round()telles PHP_ROUND_HALF_DOWNqu'existent uniquement dans PHP 5.3 ou version ultérieure.

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 d'une constante non définie PHP_ROUND_HALF_DOWN - supposé 'PHP_ROUND_HALF_DOWN' Avertissement (2): Mauvais nombre de paramètres pour round ()

John Carter
la source
Merci pour le partage. J'ai raté la self::partie. Ça marche maintenant.
moreirapontocom
Sans aucun doute, cette réponse est plus complète que d'autres et mérite le meilleur badge de réponse! La portée de la classe m'a trop manqué et j'ai fini par obtenir des informations précieuses pour l'avenir. Merci, John!
Harish ST
6

vous avez probablement oublié d'utiliser "".

Par exemple:

$_array[text] = $_var;

changer en:

$_array["text"] = $_var;
Giancarlo
la source
3

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

$ _POST [e-mail]

devrait être:

$ _POST ['email']

Ahmed Al-hajri
la source
Ce devrait être $ _POST ['email'];
Ibnul Quayum
1

La bonne façon d'utiliser les variables de publication est

<?php

$department = $_POST['department'];

?>

Utiliser une citation simple (')

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

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

santoshvijaypawar
la source
1

Insérez 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']); 
Hackbal Teamz
la source
0

Je ne suis pas sûr s'il y a une différence en utilisant un allumeur de code 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.

Jorge Vicente Mendoza
la source
1
Il n'y a pas de différence entre les guillemets simples et doubles dans ce cas.
Robbie Averill
1
@RobbieAverill alors que dans ce cas en fait il n'y en a pas - comme les chaînes entre guillemets simples affichent les choses telles quelles où les chaînes de guillemets doubles analysent les caractères d'échappement et évaluent les variables, il est bon d'utiliser des chaînes entre guillemets simples dans ce scénario.
Frankie
0

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

// constantes de récupération prédéfinies

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

J'ai testé et réussi.

Venkat
la source