"Nota: variable indefinida", "Nota: índice indefinido", "Advertencia: tecla de matriz indefinida", y "Nota: offset indefinido" utilizando PHP

Estoy ejecutando un script PHP y seguir recibiendo errores como:

Aviso: Variable indefinida: my_variable_name in C:\wamp\www\mypath\index.php on line 10

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

Advertencia: clave de matriz no definida "my_index" en C:\wamp\www\mypath\index.php en la línea 11

La línea 10 y 11 se ve 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 guión durante años y nunca he tenido ningún problema.

¿Cómo los arreglo?


Esta es una cuestión de referencia general para que las personas se vinculen como duplicadas, en lugar de tener que explicar el problema una y otra vez. Siento que esto es necesario porque la mayoría de las respuestas del mundo real sobre este tema son muy específicas.

Related Meta discussion:

Pregunta hecha hace 13 años, 3 meses, 3 días - Por Kairo


11 Respuestas:

  • Este mensaje de error está destinado a ayuda un programador PHP para detectar un tipopo o un error al acceder a una variable (o un elemento array) que no existe. Así que un buen programador:

    1. Asegúrate de que cada llave variable o matriz ya está definida por el momento en que se va a utilizar. En caso de que se necesite una variable dentro de una función, debe pasarse a esa función como parámetro.
    2. Presta atención a este error y procede a corregirlo, al igual que con cualquier otro error. Puede indicar un error de ortografía o que algún procedimiento no devolvió los datos que debería.
    3. Sólo en una rara ocasión, cuando las cosas no están bajo el control del programador, se puede añadir un código para evitar este error. Pero de ninguna manera debería ser un hábito insensato.

    Aviso / Advertencia: Variable indefinida

    Aunque PHP no requiere una declaración variable, lo recomienda para evitar algunas vulnerabilidades de seguridad o errores donde se olvidaría de dar un valor a una variable que se utilizará más adelante en el script. Lo que PHP hace en el caso de variables no declaradas es emitir un error de E_WARNING nivel.

    Esta advertencia ayuda a un programador a detectar un nombre variable o un error similar (como una variable se le asignó un valor dentro de una condición que evaluó a falso). Además, hay otros problemas posibles con variables no inicializadas. Como es declarado en el manual PHP,

    El basarse en el valor predeterminado de una variable no inicializada es problemático en el caso de incluir un archivo en otro que utiliza el mismo nombre variable.

    Lo que significa que una variable puede obtener un valor del archivo incluido, y este valor se utilizará en lugar de null que se espera acceder a una variable no inicializada, que puede conducir a resultados impredecibles. Para evitarlo, todas las variables en un archivo PHP son las mejores para ser inicializadas antes del uso.

    Formas de abordar la cuestión:

    1. Recomendado: Declarar cada variable antes de usar. De esta manera usted verá este error sólo cuando usted realmente comete un error, tratando de utilizar una variable inexistente - la misma razón por la que este mensaje de error existe.

       //Initializing a variable
       $value = ""; //Initialization value; 0 for int, [] for array, etc.
       echo $value; // no error
       echo $vaule; // an error pinpoints a misspelled variable name
      
    • un caso especial cuando una variable se define pero no es visible en una función. Funciones en PHP tienen propias alcance variable, y si necesita utilizar en una función una variable desde el exterior, su valor debe pasarse como parámetro de la función:

      function test($param) {
          return $param + 1; 
      }
      $var = 0;
      echo test($var); // now $var's value is accessible inside through $param
      
    1. Suprimir el error con el operador de coalescing null. Pero recuerde que de esta manera PHP no será capaz de notificarle sobre el uso de nombre variable incorrecto.

       // Null coalescing operator
       echo $value ?? '';
      

      Para las versiones antiguas de PHP (traducido 7.0) isset() con ternary se puede utilizar

       echo isset($value) ? $value : '';
      

      Sé consciente Aunque, que todavía es esencialmente una supresión de errores, aunque por un solo error en particular. Así que puede evitar que PHP le ayude marcando una variable unializada.

    2. Suprimir el error con el @ operador. Dejado aquí por las razones históricas pero en serio, no debería pasar.

    Nota: Es muy recomendable implementar el punto 1.

    Aviso: Índice indefinido / offset / Advertencia: Clave de matriz definida

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

    arrays internos

    Al tratar con los arrays internos, que se definen en su código, la actitud debe ser exactamente la misma: simplemente inicializar todas las teclas antes de usar. de esta manera este error hará su trabajo previsto: notificar a un programador sobre un error en su código. Así que el enfoque es el mismo:

    Recomendado: Describa sus elementos de matriz:

        //Initializing a variable
        $array['value'] = ""; //Initialization value; 0 for int, [] for array, etc.
        echo $array['value']; // no error
        echo $array['vaule']; // an error indicates a misspelled key
    

    Un caso especial es cuando alguna función devuelve un array o algún otro valor como null o false. Entonces tiene que ser probado antes de intentar acceder a los elementos del array, como

    $row = $stmt->fetch();
    if ($row) { // the record was found and can be worked with
        echo $row['name']; 
    }
    

    arrays externos

    Con arrays externos (como $_POST / $_GET / $_SESSION o entrada JSON) la situación es un poco diferente, porque el programador no tiene el control sobre los contenidos de tales arrays. Así que comprobar la existencia clave o incluso asignar un valor predeterminado para una clave perdida podría justificarse.

    • cuando un script PHP contiene un formulario HTML, es natural que en la primera carga no haya contenido de forma. Por lo tanto, tal script debe comprobar si se presentó un formulario

        // for POST forms check the request method
        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            // process the form
        }
        // for GET forms / links check the important field
        if (isset($_GET['search'])) {
            // process the form
        }
      
    • algunos elementos del formulario HTML, como las casillas de verificación, no se envían al servidor si no se verifican. En este caso se justifica utilizar un operador coalescing null para asignar un valor predeterminado

        $agreed = $_POST['terms'] ?? false;
      
    • opcional QUERY STRING elementos o cookies deben ser tratados de la misma manera

        $limit = $_GET['limit'] ?? 20;
        $theme = $_COOKIE['theme'] ?? 'light';
      

    Pero las asignaciones deben hacerse al comienzo del guión. Validar todas las entradas, asignarlo a variables locales, y utilizarlas todo el camino en el código. Así que cada variable a la que vas a acceder existiría deliberadamente.

    Relacionados:

    Respondida el Nov 23, 2010 a las 21:33 - por codeglitch

    Votos positivos: 0 | Votos negativos: 0

  • Prueba esto.

    Q1: este aviso significa $varname no definidos en el alcance actual del script.

    Q2: Uso de isset(), condiciones vacías() antes de utilizar 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:

    Respondida el Nov 23, 2010 a las 21:40 - por pixelpioneer

    Votos positivos: 0 | Votos negativos: 0

  • Pantalla de error @ operador

    Para avisos no deseados y redundantes, uno podría utilizar el dedicado @ operador a »escondido« mensajes indefinidos de variable/índice.

    $var = @($_GET["optional_param"]);
    
    • Esto generalmente es desalentado. Los recién llegados tienden a sobreutilizarlo.
    • Es muy inapropiado para código profundo dentro de la lógica de aplicación (ignorando variables no declaradas donde no debe), por ejemplo para parámetros de función, o en bucles.
    • Hay una boca arriba sobre la isset?: o ?? supersupresión sin embargo. Los avisos todavía pueden ser registrados. Y uno puede resucitar @- notificaciones ocultas con: set_error_handler("var_dump");
      • Additonally usted no debe utilizar/recomendar habitualmente if (isset($_POST["shubmit"])) en su código inicial.
      • Los recién llegados no detectarán tal tipo. Simplemente le priva de PHPs Avisos para esos mismos casos. Añadir @ o isset sólo después verificar la funcionalidad.
      • Arregla la causa primero. No los avisos.

    • @ es fundamentalmente aceptable $_GET/$_POST parámetros de entrada, específicamente si son opcionales.

    Y puesto que esto cubre la mayoría de estas preguntas, vamos a ampliar las causas más comunes:

    $_GET / $_POST / $_REQUEST entrada no definida

    • Lo primero que haces cuando te encuentras con un índice/offset indefinido, es comprobar los tipos:
      $count = $_GET["whatnow?"];

      • Es un nombre clave esperado y presente en cada uno ¿Solicitud de página?
      • Nombres variables y array indicies son sensibles a casos en PHP.
    • En segundo lugar, si el aviso no tiene una causa obvia, use var_dump o print_r para verificar Todos arrays de entrada para su contenido de curent:

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

      Ambos revelarán si su script fue invocado con el derecho o cualquier parámetro en absoluto.

    • Alternativa o adicionalmente use su navegador devtools ()F12) e inspeccionar la pestaña de red para solicitudes y parámetros:

      browser developer tools / network tab

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

    • Para $_GET parámetros que también puede mirar en el QUERY_STRING dentro

      print_r($_SERVER);
      

      PHP tiene algunas reglas coalesce nombres de parámetro no estándar en los superglobals. Apache también podría hacer algo de reescritura. También puede mirar la materia prima suministrada $_COOKIES y otros encabezados de petición HTTP de esa manera.

    • Más obviamente mire su barra de direcciones del navegador para Parámetros:

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

      El name=value pares después de los ? marca de preguntas son sus parámetros de consulta (GET). Así que esta URL sólo podría producir $_GET["id"] y $_GET["sort"].

    • Por fin comprueba tu

      y declaraciones, si esperas un parámetro pero no recibes ninguna.

      • Asegurar que cada entrada necesaria tenga
      • El id= o title= atributo no basta.
      • A method=POST formulario debe popular $_POST.
      • Mientras que method=GET (o lo dejaría fuera) $_GET variables.
      • También es posible un formulario de suministro action=script.php?get=param via $_GET y el resto method=POST campos en $_POST junto.
      • Con configuraciones PHP modernas (≥ 5.6) se ha convertido en factible (no de moda) para utilizar $_REQUEST['vars'] otra vez, que mashes GET y POST params.
    • Si usted está empleando mod_rewrite, entonces usted debe comprobar ambos access.log así como permitir el RewriteLog para averiguar los parámetros ausentes.

    $_FILES

    • Los mismos cheques de cordura se aplican a las subidas de archivos y $_FILES["formname"].
    • Consulta adicional enctype=multipart/form-data
    • así como method=POST en tu
      declaración.
    • Véase también: PHP Error índice indefinido $_FILES?

    $_COOKIE

    • El $_COOKIE array nunca se pobla justo después setcookie(), pero sólo en cualquier solicitud de seguimiento HTTP.
    • Además de sus tiempos de validez, podrían ser limitados a subdominios o caminos individuales, y el usuario y el navegador pueden rechazarlos o eliminarlos.

    Respondida el Nov 23, 2010 a las 21:50 - por scriptsorcererf493

    Votos positivos: 0 | Votos negativos: 0

  • Generalmente debido a la "programación mala", y una posibilidad de errores ahora o después.

    1. Si es un error, haga una asignación adecuada a la variable primero: $varname=0;
    2. Si realmente sólo se define a veces, prueba para ello: if (isset($varname)), antes de utilizarlo
    3. Si es porque lo deletreaste mal, sólo correcto que
    4. Tal vez incluso la vuelta de las advertencias en ti Configuración de PHP

    Respondida el Nov 23, 2010 a las 21:56 - por htmlhelix

    Votos positivos: 0 | Votos negativos: 0

  • Significa que estás probando, evaluando o imponiendo una variable a la que aún no has asignado nada. Significa que tienes un tipo, o necesitas comprobar que la variable fue inicializada a algo primero. Revise sus trayectorias lógicas, se puede establecer en un camino pero no en otro.

    Respondida el Nov 23, 2010 a las 22:03 - por scriptsculptor

    Votos positivos: 0 | Votos negativos: 0

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

    Mi solución era esta función:

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

    Así que si quiero referirme a $name y eco si existe, simplemente escribo:

    = ifexists('name') ?
    

    Para elementos de array:

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

    En una página si quiero referirme a $_REQUEST['name']:

    = ifexistsidx($_REQUEST, 'name') ?
    

    Respondida el Nov 23, 2010 a las 22:13 - por devdynamox

    Votos positivos: 0 | Votos negativos: 0

  • Es porque la variable '$user_location' no se está definiendo. Si está usando alguno si loop dentro, que está declarando la variable '$user_location', entonces también debe tener una más bucle y definir lo mismo. Por ejemplo:

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

    El código anterior creará un error como si loop no está satisfecho y en más bucle "$user_location" no fue definido. Se pidió a PHP que hiciera eco de la variable. Para modificar el código debe hacer lo siguiente:

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

    Respondida el Nov 23, 2010 a las 22:22 - por codealchemyf00f

    Votos positivos: 0 | Votos negativos: 0

  • La mejor manera de obtener la entrada cuerda es:

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

    Esta línea es casi equivalente a:

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

    Si absolutamente quieres cuerda valor, como:

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

    Respondida el Nov 23, 2010 a las 22:32 - por techsavvypro

    Votos positivos: 0 | Votos negativos: 0

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

    Es muy común que la mayoría de los sitios funcionen bajo el reporte de error "default" de "Mostrar todos los errores, pero no 'notices' y 'deprecated'". Esto se establecerá en php.ini y se aplicará a todos los sitios en el servidor. Esto significa que los "notices" utilizados en los ejemplos serán suprimidos (hidden) mientras que otros errores, considerados más críticos, serán mostrados/recordados.

    El otro escenario crítico es que los errores se pueden ocultar (es decir,. display_errors establecido para "off" o "syslog").

    Lo que habrá sucedido en este caso es que error_reporting fue cambiado para también mostrar avisos (como por ejemplo) y/o que los ajustes se cambiaron a display_errors en pantalla (a diferencia de suprimirlos/logging).

    ¿Por qué han cambiado?

    La respuesta obvia/implest es que alguien ajustado cualquiera de estos ajustes en php.ini, o una versión actualizada de PHP ahora está usando un php.ini diferente de antes. Es el primer lugar en mirar.

    Sin embargo, también es posible anular estos ajustes en

    • .htconf (configuración de servidores, incluidos vhosts y subconfiguraciones)*
    • .htaccess
    • en el código php en sí

    y cualquiera de estos también podría haber sido cambiado.

    También hay la complicación añadida de que la configuración del servidor web puede habilitar/desactivar las directivas .htaccess, por lo que si tienes directivas en .htaccess que de repente comienzan/dejan de funcionar entonces necesitas comprobarlo.

    (.htconf / .htaccess supone que estás corriendo como apache. Si se ejecuta la línea de comandos esto no se aplicará; si se ejecuta IIS u otro servidor web, entonces necesitará revisar esos configs en consecuencia)

    Resumen

    • Check error_reporting y display_errors Las directivas de php en php.ini no han cambiado, o que no estás usando un php.ini diferente de antes.
    • Check error_reporting y display_errors directivas de php en .htconf (o vhosts etc) no han cambiado
    • Check error_reporting y display_errors directivas de php en .htaccess no han cambiado
    • Si tiene directiva en .htaccess, compruebe si todavía están permitidos en el archivo .htconf
    • Finalmente compruebe su código; posiblemente una biblioteca no relacionada; para ver si error_reporting y display_errors Allí se han establecido directivas de php.

    Respondida el Nov 23, 2010 a las 22:39 - por coderconqueror

    Votos positivos: 0 | Votos negativos: 0

  • Los mensajes de error que estás viendo en tu script PHP son comunes cuando intentas acceder a una variable que no ha sido definida o a un índice que no existe en un array. Aquí te explico cada uno de los mensajes de error que mencionaste:

    • "Aviso: Variable indefinida: my_variable_name": Este error indica que estás intentando acceder a la variable `$my_variable_name`, pero esta variable no ha sido definida previamente en tu código. Puede ser que olvidaste inicializarla o declararla antes de intentar usarla.
    • "Aviso: Índice indefinido: my_index": Este error sugiere que estás tratando de acceder a un índice específico dentro de un array utilizando la sintaxis de corchetes `[]`, pero ese índice no existe en el array `$my_array`. Es posible que el índice que estás tratando de acceder no se haya definido o que el array esté vacío.
    1. "Advertencia: clave de matriz no definida 'my_index'": Similar al error anterior, este mensaje indica que estás intentando acceder

    Respondida el Nov 24, 2010 a las 21:31 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Errores de PHP:

    "Variable indefinida": La variable a la que intentas acceder no ha sido definida o inicializada. "Índice indefinido": Intentas acceder a un elemento de una matriz usando un índice que no existe. "Advertencia: clave de matriz indefinida": Intentas acceder a un elemento de una matriz usando una clave que no existe. "Offset indefinido": Similar a "Índice indefinido", pero se utiliza para acceder a elementos de una matriz usando índices numéricos.

    Causas:

    Olvidaste definir una variable o inicializarla con un valor. Estás intentando acceder a un elemento de una matriz que no se ha creado o que se creó con un número diferente de elementos. El índice o la clave que usas para acceder a la matriz es incorrecta.

    Soluciones:

    "Variable indefinida": Define la variable antes de usarla o inicialízala con un valor predeterminado. "Índice/Clave de matriz indefinida": Verifica que la matriz exista, tenga el número correcto de elementos y que estés usando el índice o la clave correcta para acceder a ella.

    Por qué aparecen de repente:

    Cambios en el código: Es posible que hayas modificado tu guión y hayas olvidado definir una variable o acceder a una matriz de forma incorrecta. Versiones de PHP: Estas advertencias pueden aparecer en versiones más nuevas de PHP debido a cambios en las reglas de manejo de errores. Configuraciones del servidor: Los mensajes de error pueden estar ocultos o suprimidos según la configuración de tu servidor.

    Cómo resolverlos:

    • Depura tu código: Revisa el código con cuidado, en particular las líneas 10 y 11 que estás mencionando.
    • Define variables: Asegúrate de definir cualquier variable que utilices en tu código y de inicializarlas con valores predeterminados si es necesario.
    • Verifica las matrices: Comprueba que las matrices que estás intentando acceder existan, tengan el número correcto de elementos y que estés usando los índices o claves correctos.
    • Busca errores tipográficos: Revisa si hay errores tipográficos en los nombres de variables, nombres de matrices, índices o claves.
    1. Consulta la documentación de PHP: Usa la documentación de PHP para obtener más información sobre el manejo de variables y matrices y los mensajes de error específicos que estás recibiendo.

    Respondida el Nov 24, 2010 a las 21:46 - por Gemini

    Votos positivos: 0 | Votos negativos: 0