Saltar al contenido

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

Después de tanto batallar hemos encontrado el arreglo de este atasco que muchos lectores de nuestro espacio han presentado. Si tienes algún detalle que compartir no dudes en compartir tu conocimiento.

Solución:

Aviso: variable indefinida

De la vasta sabiduría del Manual 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 riesgo de seguridad importante con register_globals activado. El error de nivel E_NOTICE se emite en caso de trabajar con variables no inicializadas, pero no en el caso de agregar elementos a las variables no inicializadas. array. La construcción del lenguaje isset () se puede usar para detectar si una variable ya ha sido inicializada. Adicionalmente y más ideal es la solución de empty () ya que no genera un mensaje de advertencia o error si la variable no está inicializada.

De la 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 == false.

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 o [].

Ejemplo:

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

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

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 permitirlo durante el desarrollo.

Formas de abordar el problema:

  1. Recomendado: Declare sus variables, por ejemplo, cuando intenta agregar un string 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 null operador de unión:

    // Null coalesce operator - No need to explicitly initialize the variable.
    $value = $_POST['value'] ?? '';
    
  2. Configure un controlador de errores personalizado para E_NOTICE y redirija 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 un array.

Formas de abordar el problema:

  1. Compruebe si el índice existe antes de acceder a él. Para esto puedes usar isset() o 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 array índice que no existe:

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

Se utilizan dos variables para acceder a dos array elementos, sin embargo, solo hay uno array elemento, í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 o $_SESSION. Para $_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:

  • Aviso: variable indefinida
  • Aviso: índice indefinido

Prueba estos

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:

  • Al usar sesiones, session_start(); Se requiere que se coloque dentro de todos los archivos que utilizan sesiones.

  • http://php.net/manual/en/features.sessions.php

Pantalla de error @ operador

Para avisos no deseados y redundantes, se puede utilizar el dedicado @ operador a »esconder«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?: o ?? 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 @ o isset solamente después 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 se encuentra con un índice / desplazamiento indefinido es verificar si hay errores tipográficos:
    $count = $_GET["whatnow?"];

    • ¿Es esto un esperado key nombre y presente en cada solicitud de página?
    • Nombres de variables y array los indicios distinguen entre mayúsculas y minúsculas en PHP.
  • En segundo lugar, si el aviso no tiene una causa obvia, utilice var_dump o print_r para verificar todos 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 en

    print_r($_SERVER);
    

    PHP tiene algunas reglas para fusionar nombres de parámetros no estándar en 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 ver los parámetros GET:

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

    los 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

    y declaraciones, si espera un parámetro pero no recibe ninguno.

    • Asegúrese de que cada entrada requerida tenga un
    • los id= o title= attribute 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 vuelto factible (no está de moda) 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
  • Al igual que method=POST en tus
    declaración.
  • Consulte también: Error de índice no definido de PHP $ _FILES?

$_COOKIE

  • los $_COOKIE array nunca se puebla justo 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.

valoraciones y reseñas

Tienes la posibilidad dar recomendación a esta noticia si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *