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?
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).
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.
$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)...
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
$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();
}
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
}
}
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 ()
vous avez probablement oublié d'utiliser ""
.
Par exemple:
$_array[text] = $_var;
changer à:
$_array["text"] = $_var;
Vous avez oublié de mettre des guillemets simples autour de vos clés de tableau:
$ _POST [email]
devrait être:
$ _POST ['email']
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']);
<?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
La manière correcte d’utiliser les variables post est la suivante:
<?php
$department = $_POST['department'];
?>
Utiliser une seule citation (')
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.
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.