¿Qué significa el mensaje de error de PHP "Notice: Use of undefined constant"?


PHP está escribiendo este error en los logs: "Notice: Use of undefined constant".

Error en los registros:

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)

Líneas de código 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é significa y por qué lo estoy viendo?

Author: hakre, 2010-05-31

9 answers

Debe citar las claves de su matriz:

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

Tal como está, estaba buscando constantes llamadas department, name, email, message, etc. Cuando no encuentra tal constante, PHP (extrañamente) la interpreta como una cadena ('department', etc). Obviamente, esto puede romperse fácilmente si defines una constante más tarde (aunque es un mal estilo tener constantes en minúsculas).

 185
Author: Matthew Flaschen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-14 06:12:11

El mensaje de error se debe al desafortunado hecho de que PHP declarará implícitamente un token desconocido como una cadena constante del mismo nombre.

Es decir, está tratando de interpretar esto (note las comillas que faltan):

$_POST[department]

La única forma válida en que esta sería una sintaxis válida en PHP es si previamente había definida una constante department. Así que tristemente, en lugar de morir con un error Fatal en este punto, emite este Aviso y actúa como si se hubiera definido una constante con el mismo nombre y valor:

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

Hay varias formas de obtener este mensaje de error, pero todas tienen la misma causa raíz: un token que podría ser una constante.

Cadenas que faltan comillas: $my_array[bad_key]

Este es el problema en su caso, y es porque tiene claves de matriz de cadenas que no se han citado. Arreglar las teclas de cadena solucionará el error:

Cambio:

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

A:

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

Signo de dólar que falta variable: var_without_dollar

Otra razón por la que puede ver este mensaje de error es si deja el $ de una variable, o $this-> de un miembro. Por ejemplo, cualquiera de los siguientes causaría un mensaje de error similar:

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

Carácter no válido en el nombre de la variable: $bad-variable-name

Un problema similar pero más sutil puede resultar si intenta usar un carácter no permitido en un nombre de variable - un guion (-) en lugar de un guion bajo _ sería un caso común.

Por ejemplo, esto es OK, ya que se permiten guiones bajos en los nombres de variables :

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

Pero esto no es:

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

Se interpretará de la misma manera: {[23]]}

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

Se refiere a una constante de clase sin especificar el alcance de la clase

Para hacer referencia a una constante de clase necesitas especificar el ámbito de clase con ::, si pierdes esto PHP pensará que estás hablando de un define() global.

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

Usando una constante que no está definida en esta versión de PHP, o está definida en una extensión que no está instalada

Hay algunas constantes definidas por el sistema que solo existen en versiones más recientes de PHP, por ejemplo, las constantes de opción mode para round() tales como PHP_ROUND_HALF_DOWN solo existen en PHP 5.3 o posterior.

Así que si intentó usar esta característica en PHP 5.2, diga:

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

Recibirías este mensaje de error:

Uso de la constante indefinida PHP_ROUND_HALF_DOWN-asumido "PHP_ROUND_HALF_DOWN" Warning (2): Cuenta de parámetros incorrecta para round ()

 67
Author: John Carter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-06 06:54:52

Probablemente olvidaste usar "".

Por ejemplo:

$_array[text] = $_var;

Cambiar a:

$_array["text"] = $_var;
 6
Author: Giancarlo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-30 15:11:05

La forma correcta de usar las variables post es

<?php

$department = $_POST['department'];

?>

Use comillas simples ( ' )

 1
Author: Srihari Goud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-10 05:37:56
<?php 
  ${test}="test information";
  echo $test;
?>

Aviso: Uso de prueba constante indefinida-supuesto 'prueba' en D:\xampp\htdocs\sp\test\envoirnmentVariables.php en línea 3 información del ensayo

 1
Author: santoshvijaypawar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-02 07:52:41

Insertar comillas simples.

Ejemplo

$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
Author: Hackbal Teamz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-21 16:07:03

No estoy seguro de si hay alguna diferencia estoy usando code igniter y uso "" para los nombres y funciona muy 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"]);

Saludos,

Jorge.

 0
Author: Jorge Vicente Mendoza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-08 16:28:09

Se le olvidó poner comillas simples alrededor de las claves de su matriz:

$_POST[email]

Debe ser:

$_POST ['email']

 0
Author: Ahmed Al-hajri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-28 19:31:26

Parece que las constantes de fetch predefinidas desaparecieron con la extensión MySQL, por lo que necesitamos agregarlas antes de la primera función...

/ / constantes de búsqueda predifinadas

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

Probé y tuve éxito.

 0
Author: Venkat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-21 14:50:09