Estoy ejecutando un script PHP y sigo recibiendo errores como:
Aviso: Variable indefinida: my_variable_name en C: \ wamp \ www \ mypath \ index.php en la línea 10
Aviso: índice indefinido: my_index C: \ wamp \ www \ mypath \ index.php en la línea 11
Las líneas 10 y 11 se ven así:
echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];
¿Cuál es el significado de estos mensajes de error?
¿Por qué aparecen de repente? Solía usar este script durante años y nunca he tenido ningún problema.
¿Cómo los soluciono?
Esta es una pregunta de referencia general para que las personas se vinculen como duplicados, en lugar de tener que explicar el problema una y otra vez. Creo que esto es necesario porque la mayoría de las respuestas del mundo real sobre este tema son muy específicas.
Meta discusión relacionada:
and-notice-undef
, solo una sugerencia para que la URL no se corte. Quizás incluso eliminar las (demasiadas) citas. OPHP: “Undefined variable/index/offset” notices
and-notice-undef
. Fue solo una (pocas) sugerencias. Simplemente se repite también siendoNotice: Undefined
.Respuestas:
Aviso: variable indefinida
De la vasta sabiduría del Manual PHP :
De la documentación de PHP :
Esto significa que usted podría utilizar solamente
empty()
para determinar si se ha establecido la variable, y además se comprueba la variable frente a la siguiente,0
,0.0
,""
,"0"
,null
,false
o[]
.Ejemplo:
Pruebe el fragmento anterior en el editor de PHP en línea 3v4l.org
Aunque PHP no requiere una declaración de variable, la recomienda para evitar algunas vulnerabilidades o errores de seguridad en los que uno olvidaría darle un valor a una variable que se usará más adelante en el script. Lo que PHP hace en el caso de variables no declaradas es emitir un error de muy bajo nivel
E_NOTICE
, uno que ni siquiera se informa de manera predeterminada, pero el Manual aconseja permitirlo durante el desarrollo.Formas de lidiar con el problema:
Recomendado: declare sus variables, por ejemplo, cuando intente agregar una cadena a una variable indefinida. O use
isset()
/!empty()
para verificar si se declaran antes de hacer referencia a ellos, como en:Esto se ha vuelto mucho más limpio a partir de PHP 7.0, ahora puede usar el operador de fusión nula :
Establezca un controlador de errores personalizado para E_NOTICE y redirija los mensajes fuera de la salida estándar (tal vez a un archivo de registro):
Inhabilite E_NOTICE de los informes. Una forma rápida de excluir solo
E_NOTICE
es:Suprima el error con el operador @ .
Nota: Se recomienda encarecidamente implementar solo el punto 1.
Aviso: índice indefinido / desplazamiento indefinido
Este aviso aparece cuando usted (o PHP) intenta acceder a un índice indefinido de una matriz.
Formas de lidiar con el problema:
Compruebe si el índice existe antes de acceder a él. Para esto puedes usar
isset()
oarray_key_exists()
:La construcción del lenguaje
list()
puede generar esto cuando intenta acceder a un índice de matriz que no existe:Se utilizan dos variables para acceder a dos elementos de la matriz, sin embargo, solo hay un elemento de la matriz, índice
0
, por lo que esto generará:$_POST
/$_GET
/$_SESSION
variableLos avisos anteriores aparecen a menudo cuando se trabaja con
$_POST
,$_GET
o$_SESSION
. Para$_POST
y$_GET
solo tiene que verificar si el índice existe o no antes de usarlos. Para ello$_SESSION
, debe asegurarse de haber iniciado la sesiónsession_start()
y de que el índice también exista.También tenga en cuenta que las 3 variables son superglobales y son mayúsculas.
Relacionado:
fuente
@
) tiene algunos problemas de rendimiento. Además, dado que suprime todos los errores dentro de un alcance particular, usarlo sin cuidado podría enmascarar los mensajes que desearía haber visto.$var = @$_GET['nonexisting'];
todavía causa aviso ..$value = isset($_POST['value']) ? $_POST['value'] : '';
lugar de usar 4.$value = @$_POST['value'];
?Prueba estos
O, como una solución rápida y sucia:
Nota sobre las sesiones:
Al usar sesiones,
session_start();
se requiere que se coloque dentro de todos los archivos usando sesiones.http://php.net/manual/en/features.sessions.php
fuente
E_NOTICE
desde elphp.ini
archivo de configuración, hagaerror_reporting = (E_ALL & ~E_NOTICE)
Operador de visualización de errores
@
Para avisos no deseados y redundantes, uno podría usar el
@
operador dedicado para » ocultar « mensajes de índice / variable indefinidos.isset?:
o??
super-supresión sin embargo. Los avisos aún pueden registrarse. Y uno puede resucitar@
avisos ocultos con:set_error_handler("var_dump");
if (isset($_POST["shubmit"]))
en su código inicial.@
oisset
solo después de verificar la funcionalidad.@
es principalmente aceptable para$_GET
/$_POST
parámetros de entrada, específicamente si son opcionales .Y dado que esto cubre la mayoría de estas preguntas, ampliemos las causas más comunes:
$_GET
/$_POST
/$_REQUEST
entrada indefinidaLo primero que debe hacer al encontrar un índice / desplazamiento indefinido es verificar los errores tipográficos:
$count = $_GET["whatnow?"];
En segundo lugar, si el aviso no tiene una causa obvia, utilice
var_dump
oprint_r
para verificar todas las matrices de entrada para su contenido actual:Ambos revelarán si su secuencia de comandos se invocó con la derecha o con algún parámetro.
Alternativamente, use adicionalmente las herramientas deF12 su navegador ( ) e inspeccione la pestaña de red para conocer las solicitudes y los parámetros:
Los parámetros POST y la entrada GET se mostrarán por separado.
Para
$_GET
los parámetros que también puedes vistazo a laQUERY_STRING
dePHP tiene algunas reglas para fusionar nombres de parámetros no estándar en las superglobales. Apache podría reescribir también. También puede ver los
$_COOKIES
encabezados de solicitud HTTP sin procesar y otros encabezados de esa manera.Más obviamente, mira la barra de direcciones de tu navegador para ver los parámetros GET :
http://example.org/script.php?id=5&sort=desc
Los
name=value
pares después del?
signo de interrogación son los parámetros de su consulta (GET). Por lo tanto, esta URL solo podría producir$_GET["id"]
y$_GET["sort"]
.Finalmente verifique sus declaraciones
<form>
y<input>
, si espera un parámetro pero no recibe ninguno.<input name=FOO>
id=
otitle=
no es suficiente.method=POST
formarse una forma$_POST
.method=GET
(o dejarlo fuera) produciría$_GET
variables.action=script.php?get=param
través de $ _GET y losmethod=POST
campos restantes en $ _POST junto.$_REQUEST['vars']
nuevamente, lo que combina los parámetros GET y POST.Si está empleando mod_rewrite, entonces debe verificar tanto
access.log
como habilitarRewriteLog
para descubrir los parámetros ausentes.$_FILES
$_FILES["formname"]
.enctype=multipart/form-data
method=POST
en tu<form>
declaración.$_COOKIE
$_COOKIE
matriz nunca se llena inmediatamente despuéssetcookie()
, sino solo en cualquier solicitud HTTP de seguimiento.fuente
Generalmente debido a la "mala programación" y la posibilidad de errores ahora o más tarde.
if (isset($varname))
antes de usarlofuente
Significa que está probando, evaluando o imprimiendo una variable a la que aún no ha asignado nada. Significa que tiene un error tipográfico o que necesita verificar que la variable se haya inicializado en algo primero. Verifique sus rutas lógicas, puede establecerse en una ruta pero no en otra.
fuente
No quería deshabilitar el aviso porque es útil, pero quería evitar escribir demasiado.
Mi solución fue esta función:
Entonces, si quiero hacer referencia a $ name y echo si existe, simplemente escribo:
Para elementos de matriz:
En la página si quiero referirme a $ _REQUEST ['nombre']:
fuente
$foo = "BABAR"; ifexists('foo');
lo que en general devolverá nulo. (Las cursivas son capítulos de php.net.)if( !empty($user) and !empty($location) ) echo "hello $user ..."
La mejor manera de obtener una cadena de entrada es:
Esta línea es casi equivalente a:
Si absolutamente desea un valor de cadena , al igual que:
fuente
Es porque la variable '$ user_location' no se está definiendo. Si está utilizando un bucle if dentro del cual está declarando la variable '$ user_location', también debe tener un bucle else y definir el mismo. Por ejemplo:
El código anterior creará un error como el bucle if no está satisfecho y en el bucle else '$ user_location' no se definió. Todavía se le pidió a PHP que repitiera la variable. Entonces, para modificar el código, debe hacer lo siguiente:
fuente
En respuesta a "" ¿Por qué aparecen de repente? Solía usar este script durante años y nunca tuve ningún problema ".
Es muy común que la mayoría de los sitios operen bajo el informe de error "predeterminado" de "Mostrar todos los errores, pero no 'avisos' y 'obsoletos'". Esto se establecerá en php.ini y se aplicará a todos los sitios en el servidor. Esto significa que esos "avisos" utilizados en los ejemplos serán suprimidos (ocultos) mientras que otros errores, considerados más críticos, serán mostrados / grabados.
La otra configuración crítica es que los errores pueden estar ocultos (es decir,
display_errors
configurados en "apagado" o "syslog").Lo que habrá sucedido en este caso es que
error_reporting
se modificó para mostrar también avisos (como en los ejemplos) y / o se cambió la configuración a ladisplay_errors
pantalla (en lugar de suprimirlos / registrarlos).¿Por qué han cambiado?
La respuesta obvia / más simple es que alguien ajustó cualquiera de estas configuraciones en php.ini, o una versión mejorada de PHP ahora está usando un php.ini diferente al anterior. Ese es el primer lugar para buscar.
Sin embargo, también es posible anular esta configuración en
y cualquiera de estos también podría haber sido cambiado.
También existe la complicación adicional de que la configuración del servidor web puede habilitar / deshabilitar las directivas .htaccess, por lo que si tiene directivas en .htaccess que de repente comienzan / dejan de funcionar, entonces debe verificar eso.
(.htconf / .htaccess suponen que se está ejecutando como apache. Si ejecuta la línea de comandos, esto no se aplicará; si ejecuta IIS u otro servidor web, deberá verificar esas configuraciones en consecuencia)
Resumen
error_reporting
ydisplay_errors
php en php.ini no han cambiado, o que no esté utilizando un php.ini diferente al anterior.error_reporting
ydisplay_errors
php en .htconf (o vhosts, etc.) no han cambiadoerror_reporting
ydisplay_errors
php en .htaccess no han cambiadoerror_reporting
ydisplay_errors
directivas de PHP se han establecido allí.fuente
la solución rápida es asignar su variable a nulo en la parte superior de su código
fuente
Solía maldecir este error, pero puede ser útil recordarle que escape de la entrada del usuario.
Por ejemplo, si pensabas que esto era inteligente, código abreviado:
...¡Piensa otra vez! Una mejor solución es:
(Utilizo una
html()
función personalizada para escapar de los personajes, su kilometraje puede variar)fuente
En PHP 7.0 ahora es posible usar un operador de fusión nulo:
Igual a:
PHP manual PHP 7.0
fuente
if (is_array($my_array['idontexist'] ?? '')) { dosomething(); }
isset()
si se apruebais_array()
, lo cual es un comportamiento booleano e inesperado.Uso todo el tiempo propia función útil exst () que declara variables automáticamente.
Tu código será -
fuente
En un lenguaje muy simple .
El error es que está utilizando una variable
$user_location
que no ha definido anteriormente y que no tiene ningún valor, por lo que le recomiendo que declare esta variable antes de usarla , por ejemplo:$user_location = '';
O
$user_location = 'Los Angles';
Este es un error muy común que puede enfrentar, así que no se preocupe, simplemente declare la variable y disfrute de la codificación .
fuente
¿Por qué no mantener las cosas simples?
fuente
¿POR QUÉ ESTÁ PASANDO ESTO?
Con el tiempo, PHP se ha convertido en un lenguaje más centrado en la seguridad. La configuración que solía estar desactivada de manera predeterminada ahora se activa de manera predeterminada. Un ejemplo perfecto de esto es
E_STRICT
, que se activó por defecto a partir de PHP 5.4.0 .Además, de acuerdo con la documentación de PHP, de forma predeterminada,
E_NOTICE
está deshabilitado en php.ini. Los documentos PHP recomiendan activarlo con fines de depuración . Sin embargo, cuando descargo PHP desde el repositorio de Ubuntu, y desde la pila de Windows de BitNami, veo algo más.Tenga en cuenta que en
error_reporting
realidad se establece en el valor de producción de forma predeterminada, no en el valor "predeterminado" de forma predeterminada. Esto es algo confuso y no está documentado fuera de php.ini, por lo que no lo he validado en otras distribuciones.Sin embargo, para responder a su pregunta, este error aparece ahora cuando no apareció antes porque:
Instaló PHP y la nueva configuración predeterminada está algo mal documentada pero no excluye
E_NOTICE
.E_NOTICE
advertencias como variables indefinidas e índices indefinidos realmente ayudan a que su código sea más limpio y seguro. Puedo decirte que, hace años, mantenerE_NOTICE
habilitado me obligó a declarar mis variables. Hizo MUCHO más fácil aprender C, no declarar variables es mucho más molesto.¿QUÉ PUEDO HACER AL RESPECTO?
Apague
E_NOTICE
copiando el "Valor predeterminado"E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
y reemplazándolo con lo que actualmente no está comentado después del inicio de sesión igualerror_reporting =
. Reinicie Apache o PHP si usa CGI o FPM. Asegúrese de estar editando el php.ini "correcto". El correcto será Apache si está ejecutando PHP con Apache, fpm o php-fpm si está ejecutando PHP-FPM, cgi si está ejecutando PHP-CGI, etc. Este no es el método recomendado, pero si tiene código heredado ser extremadamente difícil de editar, entonces podría ser tu mejor apuesta.Desactiva
E_NOTICE
el nivel de archivo o carpeta. Esto podría ser preferible si tiene algún código heredado pero de lo contrario quiere hacer las cosas de la manera "correcta". Para hacer esto, debe consultar Apache2, Nginx o el servidor que elija. En Apache, usaríasphp_value
dentro de<Directory>
.Reescribe tu código para estar más limpio. Si necesita hacer esto mientras se muda a un entorno de producción o no quiere que alguien vea sus errores, asegúrese de deshabilitar cualquier visualización de errores y solo registrar sus errores (vea
display_errors
ylog_errors
en php.ini y la configuración de su servidor) .Para ampliar en la opción 3: Este es el ideal. Si puedes seguir esta ruta, deberías. Si no va por esta ruta inicialmente, considere mover esta ruta eventualmente probando su código en un entorno de desarrollo. Mientras lo hace, deshágase
~E_STRICT
y~E_DEPRECATED
vea qué podría salir mal en el futuro. Verá MUCHOS errores desconocidos, pero evitará que tenga problemas desagradables cuando necesite actualizar PHP en el futuro.¿Qué significan los errores?
Undefined variable: my_variable_name
- Esto ocurre cuando una variable no se ha definido antes de su uso. Cuando se ejecuta el script PHP, internamente solo asume un valor nulo. Sin embargo, ¿en qué escenario necesitaría verificar una variable antes de definirla? En última instancia, este es un argumento para el "código descuidado". Como desarrollador, puedo decirle que me encanta cuando veo un proyecto de código abierto donde las variables se definen tan alto en sus alcances como se pueden definir. Hace que sea más fácil saber qué variables aparecerán en el futuro y hace que sea más fácil leer / aprender el código.Undefined index: my_index
- Esto ocurre cuando intenta acceder a un valor en una matriz y no existe. Para evitar este error, realice una verificación condicional.Otra opción es declarar una matriz vacía en la parte superior de su función. Esto no siempre es posible.
(consejo adicional)
vim
persona en estos días :).fuente
índice indefinido significa en una matriz que solicitó un índice de matriz no disponible, por ejemplo
variable indefinida significa que ha utilizado una variable completamente no existente o que no está definida o inicializada con ese nombre, por ejemplo
desplazamiento indefinido significa en la matriz que ha solicitado una clave no existente. Y la solución para esto es verificar antes de usar
fuente
Con respecto a esta parte de la pregunta:
No hay respuestas definitivas, pero aquí hay algunas explicaciones posibles de por qué la configuración puede cambiar 'repentinamente':
Ha actualizado PHP a una versión más nueva que puede tener otros valores predeterminados para error_reporting, display_errors u otras configuraciones relevantes.
Ha eliminado o introducido algún código (posiblemente en una dependencia) que establece configuraciones relevantes en tiempo de ejecución usando
ini_set()
oerror_reporting()
(búsquelas en el código)Cambió la configuración del servidor web (suponiendo que apache aquí): los
.htaccess
archivos y las configuraciones de vhost también pueden manipular la configuración de php.Por lo general, los avisos no se muestran / informan (consulte el manual de PHP ), por lo que es posible que al configurar el servidor, el archivo php.ini no se pueda cargar por alguna razón (¿permisos de archivo?) Y usted estaba en la configuración predeterminada . Más tarde, el 'error' se resolvió (por accidente) y ahora PUEDE cargar el archivo php.ini correcto con el conjunto de informes de error para mostrar avisos.
fuente
Si trabaja con clases, debe asegurarse de hacer referencia a las variables miembro utilizando
$this
:fuente
Otra razón por la que se arrojará un aviso de índice indefinido sería que se omitió una columna de una consulta de base de datos.
Es decir:
Luego intenta acceder a más columnas / filas dentro de un bucle.
Es decir:
o en un
while
bucle:Algo más que debe tenerse en cuenta es que en un * NIX OS y Mac OS X, las cosas distinguen entre mayúsculas y minúsculas.
Consulte las siguientes preguntas y respuestas sobre la pila:
¿Los nombres de tabla en MySQL distinguen entre mayúsculas y minúsculas?
nombres de tabla de mayúsculas y minúsculas de mysql en consultas
MySql: problema de mayúsculas y minúsculas de tablas en diferentes servidores
fuente
Usar un ternario es simple, legible y limpio:
Pre PHP 7
Asigne una variable al valor de otra variable si está establecida, de lo contrario, asigne
null
(o el valor predeterminado que necesite):PHP 7+
Lo mismo, excepto que usa el Operador de fusión nula . Ya no es necesario llamar,
isset()
ya que está integrado, y no es necesario proporcionar la variable para devolver, ya que se supone que devuelve el valor de la variable que se está comprobando:Ambos detendrán los Avisos de la pregunta de OP, y ambos son el equivalente exacto de:
Si no necesita establecer una nueva variable, puede usar directamente el valor devuelto del ternario, como con
echo
, argumentos de función, etc.Eco:
Función:
Lo anterior funcionará de la misma manera con las matrices, incluidas las sesiones, etc., reemplazando la variable que se verifica con, por ejemplo,
$_SESSION['checkMe']
o con la cantidad de niveles que necesite, por ejemplo:
$clients['personal']['address']['postcode']
Supresión:
Es posible suprimir los Avisos PHP con
@
o reducir su nivel de informe de errores, pero no soluciona el problema , simplemente evita que se informe en el registro de errores. Esto significa que su código todavía intentó usar una variable que no se configuró, lo que puede significar o no que algo no funcione según lo previsto, dependiendo de cuán crucial sea el valor faltante.Realmente debería verificar este problema y manejarlo adecuadamente, ya sea sirviendo un mensaje diferente o incluso simplemente devolviendo un valor nulo para todo lo demás para identificar el estado preciso.
Si solo le importa que el Aviso no esté en el registro de errores, entonces, como opción, simplemente puede ignorar el registro de errores.
fuente
Una causa común de una variable que no existe después de enviar un formulario HTML es que el elemento del formulario no está contenido en una
<form>
etiqueta:Ejemplo: elemento no contenido dentro del
<form>
Ejemplo: Elemento ahora contenido dentro del
<form>
fuente
Probablemente estaba usando una versión anterior de PHP hasta ahora y ahora actualizó PHP, esa es la razón por la que funcionó sin ningún error hasta ahora desde hace años. hasta PHP4 no hubo error si está utilizando una variable sin definirla, pero a partir de PHP5 en adelante arroja errores para los códigos como se menciona en la pregunta.
fuente
Cuando se trata de archivos, se requiere un enctype adecuado y un método POST, que desencadenará un aviso de índice indefinido si ninguno de los dos se incluye en el formulario.
El manual establece la siguiente sintaxis básica:
HTML
PHP
Referencia:
fuente
Hice una pregunta sobre esto y me remitieron a esta publicación con el mensaje:
Estoy compartiendo mi pregunta y solución aquí:
Este es el error:
La línea 154 es el problema. Esto es lo que tengo en la línea 154:
Creo que el problema es que estoy escribiendo condiciones para la variable
$city
, que no es la clave sino el valor$key => $city
. Primero, ¿podría confirmar si esa es la causa de la advertencia? Segundo, si ese es el problema, ¿por qué no puedo escribir una condición basada en el valor? ¿Tiene que estar con la clave que necesito para escribir la condición?ACTUALIZACIÓN 1: El problema es que, al ejecutar
$citiesCounterArray[$key]
, a veces$key
corresponde a una clave que no existe en la$citiesCounterArray
matriz, pero que no siempre es el caso en función de los datos de mi bucle. Lo que necesito es establecer una condición para que si$key
existe en la matriz, luego ejecute el código, de lo contrario, omítalo.ACTUALIZACIÓN 2: Así es como lo arreglé usando
array_key_exists()
:fuente
Estos errores ocurren cada vez que usamos una variable que no está configurada.
La mejor manera de lidiar con esto es establecer informes de errores durante el desarrollo.
Para configurar el informe de errores en:
En los servidores de producción, el informe de errores está desactivado, por lo tanto, no obtenemos estos errores.
En el servidor de desarrollo, sin embargo, podemos establecer informes de errores.
Para deshacerse de este error, vemos el siguiente ejemplo:
Podemos inicializar las variables
NULL
antes de asignar sus valores o usarlos.Entonces, podemos modificar el código como:
Esto no perturbará la lógica de ningún programa y no generará un Aviso incluso si
$test
no tiene valor.Entonces, básicamente, siempre es mejor establecer informes de errores en ON para el desarrollo.
Y arregla todos los errores.
Y en la producción, los informes de errores deben estar desactivados.
fuente
Esos avisos se deben a que no tiene la variable utilizada
defined
y lamy_index
clave no estaba presente en la$my_array
variable.Esos avisos se activaron cada vez, porque su
code
no es correcto, pero probablemente no tenía el informe de avisos activado .Resuelve los errores:
Otra forma de sacar esto:
fuente
En PHP necesitas un puño para definir la variable después de eso puedes usarla.
¡Podemos comprobar si la variable está definida o no de manera muy eficiente!
Explicación simple
fuente