"Aviso: variable no definida", "Aviso: índice no definido" y "Aviso: desplazamiento no definido" con PHP

Estoy ejecutando un script PHP y sigo recibiendo errores como:

Aviso: Variable no definida: my_variable_name en C: \ wamp \ www \ mypath \ index.php en la línea 10

Aviso: índice no definido: my_index C: \ wamp \ www \ mypath \ index.php en la línea 11

Las líneas 10 y 11 tienen este aspecto:

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 la gente se vincule como duplicado, 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:

preguntado el 23 de noviembre de 10 a las 18:11

es posible que la variable no se haya inicializado. ¿Está inicializando la variable de una publicación, get o cualquier matriz? Si ese es el caso, es posible que no tenga un campo en esa matriz. Que estás accediendo. -

@Pekka 웃 - Noté que la edición agregaba "y" Aviso: Desplazamiento indefinido "" - ¿No tendría más sentido usar "PHP:" Variable no definida "," Índice no definido "," Desplazamiento indefinido "avisos" (incluso tomar PHP, ya que está etiquetado como "php". Además, la URL se corta en and-notice-undef, solo una sugerencia para que la URL no se corte. Quizás incluso eliminando las (demasiadas) comillas. O PHP: “Undefined variable/index/offset” notices -

@Fred Supongo que se puede argumentar para ambas variaciones. Existe la posibilidad de que los novatos ingresen la línea completa, incluido el "Aviso:" en su consulta de búsqueda, que estoy seguro es el principal generador de tráfico para esta pregunta. Si los mensajes están allí completos, es probable que mejore la visibilidad en los motores de búsqueda.

@Pekka 웃 Entiendo. Solo dije eso porque la URL no se cortó antes y ahora lo hace en and-notice-undef. Fue solo una (s) sugerencia (s). Simplemente se repite también siendo Notice: Undefined. -

29 Respuestas

Aviso: variable indefinida

De la vasta sabiduría del Manual de PHP:

Confiar en el valor predeterminado de una variable no inicializada es problemático en el caso de incluir un archivo en otro que usa el mismo nombre de variable. También es un importante riesgo de seguridad con registrarse_globales encendido. E_NOTICE El error de nivel se emite en caso de trabajar con variables no inicializadas, pero no en el caso de agregar elementos a la matriz no inicializada. isset () La construcción del lenguaje se puede utilizar para detectar si una variable ya se ha inicializado. Adicionalmente y más ideal es la solución de vacío() ya que no genera un mensaje de advertencia o error si la variable no está inicializada.

Desde Documentación de PHP:

No se genera ninguna advertencia si la variable no existe. Eso significa vacío() es esencialmente el equivalente conciso de ! isset ($ var) || $ var == falso.

Esto significa que solo puede usar empty() para determinar si la variable está configurada y, además, verifica la variable con lo siguiente, 0, 0.0, "", "0", null, false or [].

Ejemplo:

$o = [];
@$var = ["",0,null,1,2,3,$foo,$o['myIndex']];
array_walk($var, function($v) {
    echo (!isset($v) || $v == false) ? 'true ' : 'false';
    echo ' ' . (empty($v) ? 'true' : 'false');
    echo "\n";
});

Pruebe el fragmento anterior en el 3v4l.org editor de PHP en línea

Aunque PHP no requiere una declaración de variable, sí la recomienda para evitar algunas vulnerabilidades de seguridad o errores en los que uno se olvidaría de dar un valor a una variable que se utilizará más adelante en el script. Lo que hace PHP en el caso de variables no declaradas es emitir un error de muy bajo nivel, E_NOTICE, uno que ni siquiera se informa por defecto, pero el Manual aconseja permitir durante el desarrollo

Formas de abordar el problema:

  1. Recomendado: Declare sus variables, por ejemplo, cuando intenta agregar una cadena a una variable indefinida. O usar isset() / !empty() para comprobar si están declarados antes de hacer referencia a ellos, como en:

    //Initializing variable
    $value = ""; //Initialization value; Examples
                 //"" When you want to append stuff later
                 //0  When you want to add numbers later
    //isset()
    $value = isset($_POST['value']) ? $_POST['value'] : '';
    //empty()
    $value = !empty($_POST['value']) ? $_POST['value'] : '';
    

    Esto se ha vuelto mucho más limpio a partir de PHP 7.0, ahora puede usar el operador de fusión nula:

    // Null coalesce operator - No need to explicitly initialize the variable.
    $value = $_POST['value'] ?? '';
    
  2. Propónganse una controlador de errores personalizado para E_NOTICE y redirigir los mensajes lejos de la salida estándar (tal vez a un archivo de registro):

    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
    
  3. Deshabilite E_NOTICE de los informes. Una forma rápida de excluir solo E_NOTICE es:

    error_reporting( error_reporting() & ~E_NOTICE )
    
  4. Suprima el error con el @ operador.

Nota: Se recomienda encarecidamente implementar solo el punto 1.

Aviso: índice indefinido / compensación indefinida

Este aviso aparece cuando usted (o PHP) intenta acceder a un índice indefinido de una matriz.

Formas de abordar el problema:

  1. Compruebe si el índice existe antes de acceder a él. Para esto puedes usar isset() or array_key_exists():

    //isset()
    $value = isset($array['my_index']) ? $array['my_index'] : '';
    //array_key_exists()
    $value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
    
  2. La construcción del lenguaje list() puede generar esto cuando intenta acceder a un índice de matriz que no existe:

    list($a, $b) = array(0 => 'a');
    //or
    list($one, $two) = explode(',', 'test string');
    

Se utilizan dos variables para acceder a dos elementos de matriz, sin embargo, solo hay un elemento de matriz, índice 0, entonces esto generará:

Aviso: desplazamiento indefinido: 1

$_POST / $_GET / $_SESSION variable

Los avisos anteriores aparecen a menudo cuando se trabaja con $_POST, $_GET or $_SESSION. For $_POST y $_GET solo tiene que verificar si el índice existe o no antes de usarlos. Para $_SESSION tienes que asegurarte de haber iniciado la sesión con session_start() y que el índice también existe.

También tenga en cuenta que las 3 variables son superglobales y están en mayúsculas.

Relacionado:

contestado el 21 de mayo de 19 a las 18:05

@ dieselpower44 Un par de pensamientos: El "operador de silencio" (@) tiene algunos problemas de rendimiento. Además, dado que suprime todos los errores dentro de un alcance particular, usarlo sin cuidado podría enmascarar mensajes que desearía haber visto. - IMSoP

Ocultar los problemas NO es la forma de tratarlos. Los elementos # 2 ... # 4 se pueden usar solo en servidores de producción, no en general. - salman a

¿Es posible cerrar el mensaje en línea (no en el controlador) cuando también se usa un controlador de errores personalizado? $var = @$_GET['nonexisting']; todavía causa aviso .. - Slava

Por qué se recomienda utilizar 1. $value = isset($_POST['value']) ? $_POST['value'] : ''; en lugar de usar 4. $value = @$_POST['value'];? - forsvunnet

No recomiendo usar isset () para matrices, por ejemplo $str = '111';, (Sé que debería ser una matriz) isset($str[0]) volverá verdadero. Es mejor usar array_key_exist () en lugar de isset () - Rostami

Pruebe estas

P1: este aviso significa que $ varname no está definido en el alcance actual del script.

P2: El uso de las condiciones isset (), empty () antes de usar cualquier variable sospechosa funciona bien.

// recommended solution for recent PHP versions
$user_name = $_SESSION['user_name'] ?? '';

// pre-7 PHP versions
$user_name = '';
if (!empty($_SESSION['user_name'])) {
     $user_name = $_SESSION['user_name'];
}

O, como solución rápida y sucia:

// not the best solution, but works
// in your php setting use, it helps hiding site wide notices
error_reporting(E_ALL ^ E_NOTICE);

Nota sobre las sesiones:

Respondido el 26 de junio de 18 a las 15:06

Si usas E_NOTICE from the php.ini archivo de configuración, hacer error_reporting = (E_ALL & ~E_NOTICE) - ahmd0

De la respuesta anterior, probé isset, array_key_exists pero no funcionaron. Probé tu respuesta, .empty (), y funciona. ¡Muchas gracias! - usuario13137957

Visualización de error @ operador

Para avisos no deseados y redundantes, se puede utilizar el dedicado @ operador a "ocultar«Mensajes de índice / variable indefinidos.

$var = @($_GET["optional_param"]);
  • Por lo general, esto se desaconseja. Los recién llegados tienden a abusar de él.
  • Es muy inapropiado para el código dentro de la lógica de la aplicación (ignorando las variables no declaradas donde no debería), por ejemplo, para los parámetros de funciones o en bucles.
  • Hay una ventaja sobre el isset?: or ?? super-supresión sin embargo. Los avisos aún pueden registrarse. Y uno puede resucitar @-notificaciones ocultas con: set_error_handler("var_dump");
    • Además, no debería usar / recomendar habitualmente if (isset($_POST["shubmit"])) en su código inicial.
    • Los recién llegados no detectarán tales errores tipográficos. Simplemente lo priva de Avisos de PHP para esos mismos casos. Agregar @ or isset , solamente después de verificar la funcionalidad.
    • Primero arregle la causa. No los avisos.

  • @ 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 indefinida

  • Lo primero que debe hacer cuando encuentra un índice / desplazamiento indefinido es verificar si hay errores tipográficos:
    $count = $_GET["whatnow?"];

    • ¿Es este un nombre de clave esperado y está presente en cada solicitud de página?
    • Nombres de variables y Los índices de matriz distinguen entre mayúsculas y minúsculas en PHP.
  • En segundo lugar, si el aviso no tiene una causa obvia, utilice var_dump or print_r para verificar todos los matrices de entrada por su contenido actual:

    var_dump($_GET);
    var_dump($_POST);
    //print_r($_REQUEST);
    

    Ambos revelarán si su script fue invocado con el parámetro correcto o con algún parámetro.

  • Alternativamente o adicionalmente use su devtools del navegador (F12) e inspeccione la pestaña de red en busca de solicitudes y parámetros:

    herramientas de desarrollador del navegador / pestaña de red

    Los parámetros POST y la entrada GET se mostrarán por separado.

  • Para $_GET parámetros también puede echar un vistazo a los QUERY_STRING in

    print_r($_SERVER);
    

    PHP tiene algunas reglas para juntarse nombres de parámetros no estándar en las superglobales. Apache también podría hacer algunas reescrituras. También puede mirar en bruto suministrado $_COOKIES y otros encabezados de solicitud HTTP de esa manera.

  • Más obviamente, mire la barra de direcciones de su navegador para OBTENER parámetros:

    http://example.org/script.php?id=5&sort=desc

    El sistema name=value pares después de la ? signo de interrogación son los parámetros de su consulta (GET). Por lo tanto, esta URL solo podría generar $_GET["id"] y $_GET["sort"].

  • Finalmente revisa tu <form> y <input> declaraciones, si espera un parámetro pero no recibe ninguno.

    • Asegúrese de que cada entrada requerida tenga un <input name=FOO>
    • El sistema id= or title= atributo no es suficiente.
    • A method=POST la forma debe poblar $_POST.
    • Mientras que un method=GET (o dejarlo fuera) cedería $_GET variables.
    • También es posible que un formulario proporcione action=script.php?get=param a través de $ _GET y el resto method=POST campos en $ _POST al lado.
    • Con las configuraciones PHP modernas (≥ 5.6) se ha convertido factible (no de moda) para usar $_REQUEST['vars'] de nuevo, que combina los parámetros GET y POST.
  • Si está empleando mod_rewrite, debe marcar tanto el access.log así como habilitar el RewriteLog para averiguar los parámetros ausentes.

$_FILES

  • Las mismas comprobaciones de cordura se aplican a las cargas de archivos y $_FILES["formname"].
  • Además, compruebe enctype=multipart/form-data
  • Tanto como method=POST en tu <form> declaración.
  • Ver también: Error de índice no definido de PHP $ _FILES?

$_COOKIE

  • El sistema $_COOKIE la matriz nunca se llena inmediatamente después setcookie(), pero solo en cualquier solicitud HTTP de seguimiento.
  • Además, su validez se agota, podrían estar restringidos a subdominios o rutas individuales, y el usuario y el navegador pueden simplemente rechazarlos o eliminarlos.

Respondido 22 ago 18, 22:08

Si tiene curiosidad por saber cuál es el impacto en el rendimiento, este artículo lo resume bien, derickrethans.nl/…. - Anacardos

@GajusKuizinas Ha habido algunos cambios desde 2009, en particular php.net/ChangeLog-5.php#5.4.0 cambia el resultado drásticamente (ver "Motor Zend, rendimiento" y "operador (silencio)"). - Mario

Gracias @mario, interesante. Ahora, si alguien fue lo suficientemente bueno para comparar los dos ... 3v4l.org/CYVOn/perf#tabs 3v4l.org/FLp3D/perf#tabs Según esta prueba, parecen ser idénticos (observe que la escala cambia). - Anacardos

Generalmente debido a una "mala programación" y la posibilidad de errores ahora o más tarde.

  1. Si es un error, primero haga una asignación adecuada a la variable: $ varname = 0;
  2. Si realmente solo se define a veces, pruébelo: if (isset($varname)), antes de usarlo
  3. Si es porque lo escribiste mal, corrígelo
  4. Tal vez incluso apague las advertencias en ti Configuración de PHP

Respondido 11 Abr '18, 09:04

No desactive las advertencias. En lenguajes más estrictos, a menudo significan "puede haber un error, es mejor que revises esta línea dos veces"; en un lenguaje tan permisivo como PHP, a menudo significan "este código es una mierda y probablemente está plagado de errores; intentaré hacer algo de sentido, pero será mejor que lo arregles lo antes posible ". - usuario395760

Aunque estoy de acuerdo con los primeros tres puntos, el número 4 es simplemente incorrecto. Ocultar un problema no hará que desaparezca e incluso podría causar más problemas en el futuro. - valentin flachsel

@Freek es absolutamente cierto, pero en algunos escenarios (script comprado, conocimiento técnico cero, necesito que se ejecute para mañana ...) es la solución de cinta adhesiva, realmente mala, que siempre debe enfatizarse, pero es una opción. Pekka

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 primero debe verificar que la variable se haya inicializado con algo. Verifique sus rutas lógicas, puede establecerse en una ruta pero no en otra.

respondido 24 nov., 10:02

No quería desactivar el aviso porque es útil, pero quería evitar escribir demasiado.

Mi solución fue esta función:

function ifexists($varname)
{
  return(isset($$varname)?$varname:null);
}

Entonces, si quiero hacer referencia a $ name y echo si existe, simplemente escribo:

<?=ifexists('name')?>

Para elementos de matriz:

function ifexistsidx($var,$index)
{
  return(isset($var[$index])?$var[$index]:null);
}

En la página si quiero hacer referencia a $ _REQUEST ['nombre']:

<?=ifexistsidx($_REQUEST,'name')?>

Respondido el 30 de diciembre de 11 a las 14:12

Su función ifexists () no me funciona en PHP 5.3. Las variables de la persona que llama no están disponibles en el ámbito local de la función (consulte Alcance variable), a menos que sean Superglobales o juegas con $ GLOBALES, asi que $foo = "BABAR"; ifexists('foo'); en general, devolverá nulo. (Las cursivas son capítulos de php.net). esquiador

ahora recibirás "hola de" ... ¿cuál es el punto? solo revisa el valor if( !empty($user) and !empty($location) ) echo "hello $user ..." - gcb

La mejor forma de obtener información cadena es:

$value = filter_input(INPUT_POST, 'value');

Este one-liner es casi equivalente a:

if (!isset($_POST['value'])) {
    $value = null;
} elseif (is_array($_POST['value'])) {
    $value = false;
} else {
    $value = $_POST['value'];
}

Si absolutamente quieres cadena valor, al igual que:

$value = (string)filter_input(INPUT_POST, 'value');

Respondido 26 ago 14, 23:08

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', entonces también debe tener un bucle else y definir el mismo. Por ejemplo:

$a=10;
if($a==5) { $user_location='Paris';} else { }
echo $user_location;

El código anterior creará un error ya que el bucle if no se satisface y en el bucle else no se definió '$ user_location'. Aún así, se le pidió a PHP que repitiera la variable. Entonces, para modificar el código debes hacer lo siguiente:

$a=10;
if($a==5) { $user_location='Paris';} else { $user_location='SOMETHING OR BLANK'; }
echo $user_location;

Respondido el 22 de Septiembre de 13 a las 13:09

En respuesta a "" ¿Por qué aparecen de repente? Solía ​​usar este script durante años y nunca he tenido ningún problema ".

Es muy común que la mayoría de los sitios operen bajo el informe de errores "predeterminado" de "Mostrar todos los errores, pero no los 'avisos' y 'obsoletos'". Esto se establecerá en php.ini y se aplicará a todos los sitios del servidor. Esto significa que esos "avisos" usados ​​en los ejemplos serán suprimidos (ocultos) mientras que otros errores, considerados más críticos, serán mostrados / registrados.

La otra configuración crítica es que los errores se pueden ocultar (es decir, display_errors establecido en "desactivado" o "syslog").

Lo que habrá sucedido en este caso es que el error_reporting se cambió para mostrar también avisos (según los ejemplos) y / o que la configuración se cambió a display_errors en la 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 estos ajustes en

  • .htconf (configuración del servidor web, incluidos vhosts y subconfiguraciones) *
  • .htaccess
  • en el propio código php

y cualquiera de estos también podría haberse 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 asume que se está ejecutando como apache. Si ejecuta la línea de comando, esto no se aplicará; si ejecuta IIS u otro servidor web, deberá verificar esas configuraciones en consecuencia)

Resumen

  • Consulta error_reporting y display_errors Las directivas php en php.ini no han cambiado, o que no está usando un php.ini diferente al anterior.
  • Consulta error_reporting y display_errors Las directivas php en .htconf (o vhosts, etc.) no han cambiado
  • Consulta error_reporting y display_errors Las directivas php en .htaccess no han cambiado
  • Si tiene directivas en .htaccess, verifique si todavía están permitidas en el archivo .htconf
  • Finalmente verifique su código; posiblemente una biblioteca no relacionada; para ver si error_reporting y display_errors Las directivas php se han establecido allí.

respondido 23 nov., 16:01

Experimentamos un cambio de comportamiento similar a este que se debió a error_reporting comportarse de manera diferente a lo esperado debido a una costumbre error_handler en nuestro código que antes no conocíamos. - xdmoore

la solución rápida es asignar su variable a nula en la parte superior de su código

$user_location = null;

contestado el 12 de mayo de 14 a las 20:05

Solía ​​maldecir este error, pero puede ser útil recordarle que debe escapar de la entrada del usuario.

Por ejemplo, si pensaba que esto era inteligente, código abreviado:

// Echo whatever the hell this is
<?=$_POST['something']?>

...¡Piensa otra vez! Una mejor solución es:

// If this is set, echo a filtered version
<?=isset($_POST['something']) ? html($_POST['something']) : ''?>

(Yo uso una costumbre html() función para escapar de los caracteres, su kilometraje puede variar)

Respondido 28 Jul 15, 20:07

Utilizo todas las funciones útiles propias del tiempo exst () que declaran variables automáticamente.

Tu código será -

$greeting = "Hello, ".exst($user_name, 'Visitor')." from ".exst($user_location);


/** 
 * Function exst() - Checks if the variable has been set 
 * (copy/paste it in any place of your code)
 * 
 * If the variable is set and not empty returns the variable (no transformation)
 * If the variable is not set or empty, returns the $default value
 *
 * @param  mixed $var
 * @param  mixed $default
 * 
 * @return mixed 
 */

function exst( & $var, $default = "")
{
    $t = "";
    if ( !isset($var)  || !$var ) {
        if (isset($default) && $default != "") $t = $default;
    }
    else  {  
        $t = $var;
    }
    if (is_string($t)) $t = trim($t);
    return $t;
}

Respondido 09 Abr '13, 15:04

En PHP 7.0 ahora es posible usar el operador coalescente nulo:

echo "My index value is: " . ($my_array["my_index"] ?? '');

Igual a:

echo "My index value is: " . (isset($my_array["my_index"]) ? $my_array["my_index"] : '');

PHP manual PHP 7.0

Respondido el 13 de diciembre de 16 a las 13:12

Esto también funciona bien en declaraciones if. if (is_array($my_array['idontexist'] ?? '')) { dosomething(); } - un codificador

Su código es en realidad un error agradable que se pasa por alto: ?? - solo cheques para isset(), si pasas is_array() - que es un comportamiento booleano, se producirá un comportamiento inesperado. - elpiel

En un muy Lenguaje simple.
El error es que estás usando una variable. $user_location que no está definido por usted anteriormente y no tiene ningún valor. Así que le recomiendo que por favor declarar esta variable antes usar eso, por ejemplo:


$user_location = '';
Or
$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.

Respondido el 18 de diciembre de 15 a las 11:12

¿POR QUÉ ESTÁ PASANDO ESTO?

Con el tiempo, PHP se ha convertido en un lenguaje más centrado en la seguridad. Los ajustes que solían estar desactivados de forma predeterminada ahora están activados de forma predeterminada. Un ejemplo perfecto de esto es E_STRICT, que se activó de forma predeterminada a partir de PHP 5.4.0.

Además, de acuerdo con la documentación de PHP, por defecto, E_NOTICE está deshabilitado en php.ini. Se recomiendan los documentos PHP encenderlo con fines de depuración. Sin embargo, cuando descargo PHP del repositorio de Ubuntu, y de la pila de Windows de BitNami, veo algo más.

; Common Values:
;   E_ALL (Show all errors, warnings and notices including coding standards.)
;   E_ALL & ~E_NOTICE  (Show all errors, except for notices)
;   E_ALL & ~E_NOTICE & ~E_STRICT  (Show all errors, except for notices and coding standards warnings.)
;   E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR  (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

Darse cuenta de error_reporting en 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, así que tengo no validó esto en otras distribuciones.

Sin embargo, para responder a su pregunta, este error aparece ahora cuando no aparecía antes porque:

  1. Instaló PHP y la nueva configuración predeterminada está algo mal documentada, pero no excluye E_NOTICE.

  2. E_NOTICE Las advertencias como las variables indefinidas y los índices indefinidos en realidad ayudan a que su código sea más limpio y seguro. Puedo decirte que, hace años, manteniendo E_NOTICE habilitado me obligó a declarar mis variables. Hizo que fuera MUCHO más fácil aprender C, no declarar variables es una molestia mucho mayor.

¿QUÉ PUEDO HACER AL RESPECTO?

  1. Apagar E_NOTICE copiando el "Valor predeterminado" E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED y reemplazarlo con lo que actualmente no está comentado después de que los iguales inicien sesión error_reporting =. Reinicie Apache o PHP si usa CGI o FPM. Asegúrese de que está editando el php.ini "correcto". El correcto será Apache si está ejecutando PHP con Apache, fpm o php-fpm si ejecuta PHP-FPM, cgi si ejecuta PHP-CGI, etc. Este no es el método recomendado, pero si tiene un código heredado que va a ser extremadamente difícil de editar, entonces podría ser su mejor opción.

  2. Apagar E_NOTICE en el nivel de archivo o carpeta. Esto podría ser preferible si tiene algún código heredado pero desea hacer las cosas de la manera "correcta" de otra manera. Para hacer esto, debe consultar Apache2, Nginx o cualquiera que sea su servidor de elección. En Apache, usaría php_value dentro de <Directory>.

  3. Reescribe tu código para que sea más limpio. Si necesita hacer esto mientras se traslada a un entorno de producción o no desea que alguien vea sus errores, asegúrese de que está deshabilitando cualquier visualización de errores, y solo registro tus errores (ver display_errors y log_errors en php.ini y la configuración de su servidor).

Para ampliar la opción 3: esta es la ideal. Si puedes seguir esta ruta, deberías hacerlo. Si no va por esta ruta inicialmente, considere mover esta ruta eventualmente probando su código en un entorno de desarrollo. Mientras estás en eso, deshazte de ~E_STRICT y ~E_DEPRECATED para ver 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 que se defina? En última instancia, este es un argumento a favor del "código descuidado". Como desarrollador, puedo decirle que me encanta cuando veo un proyecto de código abierto donde las variables se definen tan arriba en sus alcances como se pueden definir. Facilita saber qué variables aparecerán en el futuro y facilita la lectura / aprendizaje del código.

function foo()
{
    $my_variable_name = '';

    //....

    if ($my_variable_name) {
        // perform some logic
    }
}

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.

// verbose way - generally better
if (isset($my_array['my_index'])) {
    echo "My index value is: " . $my_array['my_index'];
}

// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
echo "My index value is: " . $my_index_val;   

Otra opción es declarar una matriz vacía en la parte superior de su función. Esto no siempre es posible.

$my_array = array(
    'my_index' => ''
);

//...

$my_array['my_index'] = 'new string';

(consejo adicional)

  • Cuando me encontraba con estos y otros problemas, usé NetBeans IDE (gratis) y me dio una gran cantidad de advertencias y avisos. Algunos de ellos ofrecen consejos muy útiles. Esto no es un requisito y ya no uso IDE excepto para proyectos grandes. Soy más de un vim persona en estos días :).

Respondido 25 Abr '19, 12:04

¿Por qué no simplificar las cosas?

<?php
error_reporting(E_ALL); // making sure all notices are on

function idxVal(&$var, $default = null) {
         return empty($var) ? $var = $default : $var;
  }

echo idxVal($arr['test']);         // returns null without any notice
echo idxVal($arr['hey ho'], 'yo'); // returns yo and assigns it to array index, nice

?>

Respondido el 06 de junio de 13 a las 21:06

índice indefinido significa en una matriz que solicitó para un índice de matriz no disponible, por ejemplo

<?php 

$newArray[] = {1,2,3,4,5};
print_r($newArray[5]);

?>

variable indefinida significa que ha utilizado completamente una variable que no existe o que no está definida o inicializada por ese nombre, por ejemplo

<?php print_r($myvar); ?>

Desplazamiento indefinido significa en la matriz que ha solicitado una clave no existente. Y la solución para esto es verificar antes de usar

php> echo array_key_exists(1, $myarray);

Respondido el 30 de junio de 17 a las 02:06

Respecto a esta parte de la pregunta:

¿Por qué aparecen de repente? Solía ​​usar este script durante años y nunca he tenido ningún problema.

No hay respuestas definitivas, pero aquí hay algunas posibles explicaciones de por qué la configuración puede cambiar 'repentinamente':

  1. Ha actualizado PHP a una versión más reciente que puede tener otros valores predeterminados para error_reporting, display_errors u otras configuraciones relevantes.

  2. Ha eliminado o introducido algún código (posiblemente en una dependencia) que establece configuraciones relevantes en tiempo de ejecución usando ini_set() or error_reporting() (busque estos en el código)

  3. Cambió la configuración del servidor web (asumiendo apache aquí): .htaccess Los archivos y las configuraciones de vhost también pueden manipular la configuración de php.

  4. Por lo general, los avisos no se muestran / informan (consulte 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 error_reporting configurado para mostrar avisos.

respondido 28 nov., 16:19

El uso de 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 lo que sea tu préstamo estudiantil valor que necesita):

$newVariable = isset($thePotentialData) ? $thePotentialData : null;

PHP + 7
Lo mismo excepto usar Operador coalescente nulo. Ya no hay necesidad de llamar isset() ya que esto 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á verificando:

$newVariable = $thePotentialData ?? null;

Ambos detendrá los Avisos de la pregunta OP, y ambas son el equivalente exacto de:

if (isset($thePotentialData)) {
    $newVariable = $thePotentialData;
} else {
    $newVariable = null;
}

 
Si no necesita configurar una nueva variable, puede usar directamente el valor devuelto por el ternario, como con echo, argumentos de función, etc:

eco:

echo 'Your name is: ' . isset($name) ? $name : 'You did not provide one';

Función:

$foreName = getForeName(isset($userId) ? $userId : null);

function getForeName($userId)
{
    if ($userId === null) {
        // Etc
    }
}

Lo anterior funcionará de la misma manera con las matrices, incluidas las sesiones, etc., reemplazando la variable que se está verificando con, por ejemplo:
$_SESSION['checkMe']
o la profundidad de los niveles que necesite, por ejemplo:
$clients['personal']['address']['postcode']


 

Supresión:

Es posible suprimir los Avisos de PHP con @ o reducir su nivel de informes de errores, pero no soluciona el problema, simplemente evita que se informe en el registro de errores. Esto significa que su código aún intentó usar una variable que no estaba configurada, lo que puede o no significar que algo no funciona como se esperaba, dependiendo de cuán crucial sea el valor faltante.

Realmente debería verificar este problema y manejarlo adecuadamente, ya sea entregando un mensaje diferente o 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, puede simplemente ignorar el registro de errores.

Respondido 06 Jul 18, 19:07

Si trabaja con clases, debe asegurarse de hacer referencia a las variables miembro usando $this:

class Person
{
    protected $firstName;
    protected $lastName;

    public function setFullName($first, $last)
    {
        // Correct
        $this->firstName = $first;

        // Incorrect
        $lastName = $last;

        // Incorrect
        $this->$lastName = $last;
    }
}

Respondido 20 Jul 17, 12:07

Otra razón por la que se lanzará un aviso de índice indefinido sería que se omitió una columna de una consulta de base de datos.

Es decir:

$query = "SELECT col1 FROM table WHERE col_x = ?";

Luego tratando de acceder a más columnas / filas dentro de un bucle.

Es decir:

print_r($row['col1']);
print_r($row['col2']); // undefined index thrown

o en una while bucle:

while( $row = fetching_function($query) ) {

    echo $row['col1'];
    echo "<br>";
    echo $row['col2']; // undefined index thrown
    echo "<br>";
    echo $row['col3']; // undefined index thrown

}

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:

Respondido 25 Oct 17, 11:10

Estos errores ocurren siempre que usamos una variable que no está configurada.

La mejor manera de lidiar con estos es establecer informes de errores durante el desarrollo.

Para configurar el informe de errores en:

ini_set('error_reporting', 'on');
ini_set('display_errors', 'on');
error_reporting(E_ALL);

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 configurar el informe de errores en.

Para deshacernos de este error, vemos el siguiente ejemplo:

if ($my == 9) {
 $test = 'yes';  // Will produce error as $my is not 9.
}
echo $test;

Podemos inicializar las variables para NULL antes de asignar sus valores o utilizarlos.

Entonces, podemos modificar el código como:

$test = NULL;
if ($my == 9) {
 $test = 'yes';  // Will produce error as $my is not 9.
}
echo $test;

Esto no perturbará la lógica del programa y no producirá Aviso incluso si $test no tiene valor.

Así que, básicamente, siempre es mejor activar el informe de errores para el desarrollo.

Y corrige todos los errores.

Y en producción, el informe de errores debe desactivarse.

Respondido 25 Abr '19, 12:04

Una causa común de una variable que no existe después de una HTML se ha enviado el formulario si el elemento del formulario no está contenido en un <form> tag:

Ejemplo: elemento no contenido en el <form>

<form action="example.php" method="post">
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>

<select name="choice">
    <option value="choice1">choice 1</option>
    <option value="choice2">choice 2</option>
    <option value="choice3">choice 3</option>
    <option value="choice4">choice 4</option>
</select>

Ejemplo: elemento ahora contenido en el <form>

<form action="example.php" method="post">
    <select name="choice">
        <option value="choice1">choice 1</option>
        <option value="choice2">choice 2</option>
        <option value="choice3">choice 3</option>
        <option value="choice4">choice 4</option>
    </select>
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>

Respondido 19 Abr '20, 12:04

Probablemente estaba usando la versión anterior de PHP hasta ahora y ahora PHP actualizado, esa es la razón por la que funcionaba sin ningún error hasta ahora desde hace años. hasta PHP4 no había ningún error si está utilizando la variable sin definirla, pero a partir de PHP5 en adelante arroja errores para los códigos como se menciona en la pregunta.

Respondido 30 ago 17, 10:08

Hice una pregunta sobre esto y me remitieron a esta publicación con el mensaje:

Esta pregunta ya tiene una respuesta aquí:

"Aviso: variable no definida", "Aviso: índice no definido" y "Aviso: desplazamiento no definido" con PHP

Estoy compartiendo mi pregunta y solución aquí:

Este es el error:

enter image description here

La línea 154 es el problema. Esto es lo que tengo en la línea 154:

153    foreach($cities as $key => $city){
154        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){

Creo que el problema es que estoy escribiendo si las condiciones para la variable $city, que no es la clave sino el valor en $key => $city. Primero, ¿podría confirmar si esa es la causa de la advertencia? En segundo lugar, si ese es el problema, ¿por qué no puedo escribir una condición basada en el valor? ¿Tiene que ser con la clave que necesito para escribir la condición?

ACTUALIZACIÓN 1: El problema es que al ejecutar $citiesCounterArray[$key], a veces el $key corresponde a una clave que no existe en el $citiesCounterArray matriz, pero ese no es siempre el caso según 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():

foreach($cities as $key => $city){
    if(array_key_exists($key, $citiesCounterArray)){
        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){

Respondido el 01 de Septiembre de 18 a las 19:09

Si está enviando datos a la API, simplemente use isset ()

if(isset($_POST['param'])){
    $param = $_POST['param'];
} else {
#do something else
}

si el error se debe a una sesión, asegúrese de haber iniciado la sesión correctamente.

Respondido 29 Abr '21, 12:04

Cuando se trata de archivos, se requiere un enctype adecuado y un método POST, que activará un aviso de índice indefinido si alguno de los dos no está incluido en el formulario.

El manual establece la siguiente sintaxis básica:

HTML

<!-- The data encoding type, enctype, MUST be specified as below -->
<form enctype="multipart/form-data" action="__URL__" method="POST">
    <!-- MAX_FILE_SIZE must precede the file input field -->
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    <!-- Name of input element determines name in $_FILES array -->
    Send this file: <input name="userfile" type="file" />
    <input type="submit" value="Send File" />
</form>

PHP

<?php
// In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
// of $_FILES.

$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "File is valid, and was successfully uploaded.\n";
} else {
    echo "Possible file upload attack!\n";
}

echo 'Here is some more debugging info:';
print_r($_FILES);

print "</pre>";

?>

Referencia:

Respondido 07 Oct 17, 13:10

Esos avisos se deben a que no tiene la variable usada defined y my_index clave no estaba presente en $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:

$my_variable_name = "Variable name"; // defining variable
echo "My variable value is: " . $my_variable_name;

if(isset($my_array["my_index"])){
    echo "My index value is: " . $my_array["my_index"]; // check if my_index is set 
}

Otra forma de sacar esto:

ini_set("error_reporting", false)

Respondido el 25 de enero de 18 a las 13:01

En PHP necesitas primero definir la variable y luego puedes usarla.
¡Podemos comprobar que la variable está definida o no de manera muy eficiente !.

//If you only want to check variable has value and value has true and false value.
//But variable must be defined first.

if($my_variable_name){

}

//If you want to check variable is define or undefine
//Isset() does not check that variable has true or false value
//But it check null value of variable
if(isset($my_variable_name)){

}

Explicación simple

//It will work with :- true,false,NULL
$defineVarialbe = false;
if($defineVarialbe){
    echo "true";
}else{
    echo "false";
}

//It will check variable is define or not and variable has null value.
if(isset($unDefineVarialbe)){
    echo "true";
}else{
    echo "false";
}

contestado el 17 de mayo de 18 a las 03:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.