predefinidas - ¿Qué significa el mensaje de error de PHP "Aviso: uso de constante indefinida"?
magic constants php (9)
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?
Deberías citar las teclas de tu 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, estaba buscando constantes llamadas department
, name
, email
, message
, etc. Cuando no encuentra esa constante, PHP (extrañamente) la interpreta como una cadena (''departamento'', etc.). Obviamente, esto puede romperse fácilmente si define dicha constante más tarde (aunque es un estilo malo tener constantes en minúsculas).
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á intentando interpretar esto (fíjate en las comillas faltantes):
$_POST[department]
La única forma válida de que esto sea una sintaxis válida en PHP es si previamente había un department
constante definido. Tan tristemente, en lugar de morir con un error Fatal en este momento, 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 maneras en que puede obtener este mensaje de error, pero todas tienen la misma causa raíz: un token que podría ser una constante.
Cadenas que faltan citas: $my_array[bad_key]
Este es el problema en su caso, y es porque tiene claves de matriz de cadena que no se han citado. La reparación de las claves de cadena arreglará 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 una variable, o $this->
de 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 inválido en el nombre de la variable: $bad-variable-name
Se puede producir un problema similar pero más sutil 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 nombres de variable :
if (123 === $my_var) {
do_something();
}
Pero esto no es:
if (123 === $my-var) {
do_something();
}
Se interpretará de la misma manera que este:
if (123 === $my - var) { // variable $my minus constant ''var''
do_something();
}
En referencia a una constante de clase sin especificar el alcance de clase
Para hacer referencia a una constante de clase, debe especificar el alcance de clase con ::
, si no lo tiene, PHP pensará que está hablando de una define()
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
}
}
Usar una constante que no está definida en esta versión de PHP, o está definida en una extensión que no está instalada
Existen algunas constantes definidas por el sistema que solo existen en las versiones más nuevas de PHP, por ejemplo, las constantes de la opción de modo para round()
como PHP_ROUND_HALF_DOWN
solo existen en PHP 5.3 o posterior.
Entonces, si trataste de usar esta función en PHP 5.2, di:
$rounded = round($my_var, 0, PHP_ROUND_HALF_DOWN);
Obtendría este mensaje de error:
Uso de constante indefinida PHP_ROUND_HALF_DOWN - asumida ''PHP_ROUND_HALF_DOWN'' Advertencia (2): Recuento de parámetros incorrectos para round ()
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'']);
La forma correcta de usar variables de post es
<?php
$department = $_POST[''department''];
?>
Use una sola cita ('')
No estoy seguro de si hay alguna diferencia usando 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.
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 recuperación predefinidas
define(''MYSQL_BOTH'',MYSQLI_BOTH);
define(''MYSQL_NUM'',MYSQLI_NUM);
define(''MYSQL_ASSOC'',MYSQLI_ASSOC);
Probé y tuve éxito.
Te perdiste poniendo comillas simples alrededor de tus teclas de matriz:
$ _POST [correo electrónico]
debiera ser:
$ _POST [''email'']
probablemente te olvidaste de usar ""
.
Por ejemplo:
$_array[text] = $_var;
cambiar a:
$_array["text"] = $_var;
<?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 línea 3 información de prueba