¿Qué significa el mensaje de error de PHP "Aviso: uso de constante indefinida"?

163

PHP está escribiendo este error en los registros: "Aviso: uso de constante indefinida".

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 relevantes:

$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?

Nik
fuente

Respuestas:

217

Debe citar sus claves de 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']);

Como es, que buscaba las constantes llamadas department, name, email, message, etc. Cuando no encuentra una constante tal, PHP (extrañamente) lo interpreta como una cadena ( 'departamento', etc). Obviamente, esto puede romperse fácilmente si define una constante de este tipo más tarde (aunque es un mal estilo tener constantes en minúsculas).

Matthew Flaschen
fuente
¿Se refiere a la variable $ _POST?
Nik
3
@Columna. Metralla, ¿cuándo dije que solo se necesitaban las claves de matriz? Él necesita citar las llaves, pero no solo ellas.
Matthew Flaschen
1
así quiero decir que no hay necesidad de citar claves de matriz . uno tiene que citar cadenas, no claves de matriz. una clave no requiere ninguna cita especial.
Su sentido común el
44
No es "extraño" ... Es "compatible con versiones anteriores". PHP originalmente permitió e incluso promocionó el uso de cadenas sin comillas como claves. (De acuerdo, tal vez sigue siendo "extraño". :-)
Brian White
1
@BrianWhite Dato curioso, al proponer desaprobar esta funcionalidad , no pude encontrar evidencia de que alguna vez se promovió oficialmente, y solo las versiones beta de PHP 3.0 incluyeron el comportamiento sin previo aviso, por lo que parece ser retrocompatible con una característica que era Nunca lanzado. De todos modos, desaparecerá en PHP 8.0, siempre que eso aparezca.
IMSoP
77

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 (tenga en cuenta las comillas faltantes):

$_POST[department]

La única forma válida de que esta sea una sintaxis válida en PHP es si previamente se departmentdefinió una constante . Lamentablemente, 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 faltante variable: var_without_dollar

Otra razón por la que puede ver este mensaje de error es si deja de lado $una variable o $this->un miembro. Por ejemplo, cualquiera de los siguientes podría causar 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 guión ( -) en lugar de un guión bajo _sería un caso común.

Por ejemplo, esto está bien, ya que los guiones bajos están permitidos 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:

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

Refiriéndose a una constante de clase sin especificar el alcance de la clase

Para hacer referencia a una constante de clase, debe especificar el alcance de la clase ::, si se lo pierde de PHP, pensará que está hablando de un global define().

P.ej:

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 nuevas de PHP, por ejemplo, las constantes de opción de modo para round()las que PHP_ROUND_HALF_DOWNsolo existen en PHP 5.3 o posterior.

Entonces, si trató de 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: se asume la advertencia 'PHP_ROUND_HALF_DOWN' (2): recuento de parámetros incorrecto para round ()

John Carter
fuente
Gracias por compartir. Me perdí la self::parte. Está funcionando ahora.
moreirapontocom
¡Sin ninguna duda, esta respuesta es más completa que otras y merece la mejor insignia de respuesta! También extrañé el alcance de la clase y terminé obteniendo información valiosa para el futuro. Gracias John!
Harish ST
6

probablemente te olvidaste de usar "".

Por ejemplo:

$_array[text] = $_var;

cambiar a:

$_array["text"] = $_var;
Giancarlo
fuente
3

Te perdiste poner comillas simples alrededor de las teclas de tu matriz:

$ _POST [correo electrónico]

debiera ser:

$ _POST ['correo electrónico']

Ahmed Al-hajri
fuente
Debería ser $ _POST ['correo electrónico'];
Ibnul Quayum
1

La forma correcta de usar variables de publicación es

<?php

$department = $_POST['department'];

?>

Usar comillas simples (')

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

Aviso: Uso de prueba constante indefinida: se supone 'prueba' en D: \ xampp \ htdocs \ sp \ test \ envoirnmentVariables.php en la información de prueba de la línea 3

santoshvijaypawar
fuente
1

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']); 
Hackbal Teamz
fuente
0

No estoy seguro de si hay alguna diferencia al usar el encendedor de código 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

Jorge Vicente Mendoza
fuente
1
No hay diferencia entre comillas simples y dobles en este caso.
Robbie Averill
1
@RobbieAverill, mientras que en este caso, de hecho, no lo hay, ya que las cadenas de comillas simples muestran las cosas tal como están donde las cadenas de comillas dobles analizarán los caracteres de escape y evaluarán las variables. Es un buen estilo usar cadenas de comillas simples en este escenario.
Frankie
0

Parece que las constantes de búsqueda predefinidas desaparecieron con la extensión MySQL, por lo que debemos agregarlas antes de la primera función ...

// constantes de captación predefinidas

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

Lo probé y lo logré.

Venkat
fuente