"Notice: Undefined variable", "Notice: Undefined index", y "Notice: Undefined offset" usando PHP


Estoy ejecutando un script PHP, y sigo recibiendo errores como:

Notice: Undefined variable: my_variable_name in C:\wamp\www\mypath\index.php en línea 10

Aviso: Undefined index: my_index C:\wamp\www\mypath\index.php en 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 guión durante años y nunca he tenido ninguno. problema.

¿Cómo los arreglo?

Esta es una pregunta de Referencia General a la que la gente puede enlazar 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:

Author: Pekka 웃, 2010-11-24

27 answers

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 use el mismo nombre de variable. También es un gran riesgo de seguridad con register_globals activado. E_NOTICE el error de nivel se emite en caso de trabajar con variables no inicializadas, sin embargo no en el caso de anexar elementos a la matriz no inicializada. isset() la construcción del lenguaje 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 una advertencia o mensaje de error si la variable no se inicializa.

De Documentación PHP :

No se genera ninguna advertencia si la variable no existe. Eso significa empty () es esencialmente el conciso equivalente a !isset($var) || $var = = false .

Esto significa que solo se puede usar empty() para determinar si la variable está establecida, y además se compara la variable con lo siguiente, 0,"",null.

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 donde 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 reporta por defecto, pero el Manual aconseja permitir durante el desarrollo.

Formas de tratar el tema:

  1. Recomendado: Declare sus variables, por ejemplo cuando intenta añadir una cadena a una variable indefinida. Uso isset() / !empty() para comprobar si se declaran 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 null coalesce :

    // Null coalesce operator - No need to explicitly initialize the variable.
    $value = $_POST['value'] ?? '';
    
  2. Establezca un manejador 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. Deshabilita E_NOTICE de informes. Una forma rápida de excluir solo E_NOTICE is:

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

Nota: Se recomienda encarecidamente implementar solo el punto 1.

Aviso: Undefined index / Undefined offset

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

Formas de tratar el tema:

  1. Compruebe si el índice existe antes de acceder a él. Para ello se puede utilizar 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 lenguajelist() 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 usan dos variables para acceder a dos elementos de matriz, sin embargo solo hay un elemento de matriz, index 0, por lo que 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 tienes que comprobar si el índice existe o no antes de usarlos. Para $_SESSION tienes que asegurarte de que la sesión ha comenzado 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:

 896
Author: Rizier123,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-25 18:40:39

Prueba estos

P1: este aviso significa que var varname no es definido en el ámbito actual de la script.

Q2: 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 una 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:

 112
Author: Ish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-26 14:58:33

Visualización de error@ operador

Para avisos no deseados y redundantes, se podría utilizar el dedicado @ operator to " hide" undefined variable/index messages.

$var = @($_GET["optional_param"]);
  • Esto generalmente se desaconseja. Los recién llegados tienden a abusar de ella.
  • Es muy inapropiado para código dentro de la lógica de la aplicación (ignorando variables no declaradas donde no debería), por ejemplo, para parámetros de función, o en bucles.
  • Hay uno al revés sobre la isset?: o ?? super-supresión sin embargo. Los avisos todavía se pueden registrar. Y uno puede resucitar @ - avisos ocultos 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 tales errores. Solo te priva de Avisos de PHPs para esos mismos casos. Añadir @ o isset solo después de verificar la funcionalidad.
    • Arregla la causa primero. No el aviso.

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

Y ya que esto cubre la mayoría de tales preguntas, vamos a ampliar en las causas más comunes: {[60]]}

$_GET / $_POST / $_REQUEST entrada indefinida

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

    • ¿Es esto un nombre de clave esperado y presente en cada solicitud de página?
    • Los nombres de variables y las indicies de array distinguen entre mayúsculas y minúsculas en PHP.
  • En segundo lugar, si el aviso no tiene una causa obvia, use var_dump o print_r para verificar todas las matrices de entrada para su contenido actual:

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

    Ambos revelarán si su script fue invocado con la derecha o algún parámetro en absoluto.

  • Alternativey o además utilice su devtools del navegador (F12) e inspeccione la pestaña de red en busca de solicitudes y parámetros:

    herramientas para desarrolladores del navegador / pestaña red

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

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

    print_r($_SERVER);
    

    PHP tiene algunas reglas para unir nombres de parámetros no estándar en los superglobales. Apache podría hacer algo de reescritura también. Puedes también vea raw $_COOKIES y otros encabezados de solicitud HTTP de esa manera.

  • Más obviamente mira la barra de direcciones de tu navegador para Obtener parámetros :

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

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

  • Finalmente compruebe su <form> y <input> declaraciones, si espera un parámetro pero recibe ninguno.

    • Asegúrese de que cada entrada requerida tenga un <input name=FOO>
    • El atributo id= o title= no es suficiente.
    • Un formulario method=POST debe llenar $_POST.
    • Mientras que un method=GET (o dejarlo fuera) produciría $_GET variables.
    • También es posible que un formulario proporcione action=script.php?get=param a través de $_GET y los campos method=POST restantes en $_POST.
    • Con configuraciones PHP modernas (≥5.6) se ha vuelto factible (no está de moda) usar $_REQUEST['vars'] una vez más, que purés OBTENER y POST params.
  • Si usted está empleando mod_rewrite, entonces usted debe comprobar tanto el access.log, así como habilitar la 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
  • Así como method=POST en su declaración <form>.
  • Ver también: PHP Undefined index error _ _FILES?

$_COOKIE

  • La matriz $_COOKIE nunca se rellena justo después de setcookie(), sino solo en cualquier solicitud HTTP de seguimiento.
  • Además, su validez se agota, podrían ser restricciones para subdominios o rutas individuales, y el usuario y el navegador pueden simplemente rechazarlos o eliminarlos.
 49
Author: mario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-22 21:16:29

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 necesita verificar que la variable se inicializó a algo primero. Compruebe sus rutas lógicas, puede estar configurado en un camino pero no en otro.

 37
Author: DGM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-24 02:43:04

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

  1. Si es un error, primero haga una asignación adecuada a la variable: var varname = 0;
  2. Si realmente solo está definido a veces, pruébelo: if (isset($varname)), antes de usarlo
  3. Si es porque lo deletreaste mal, solo corrígelo
  4. Tal vez incluso a su vez de las advertencias en usted PHP-settings
 36
Author: Erik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-11 08:46:21

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

Mi solución fue esta función:

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

Así que si quiero hacer referencia a name 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')?>
 32
Author: Ferenci Zoltán László,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-30 14:14:59

La mejor manera de obtener input string es:

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

Este revestimiento es casi equivalente a:

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

Si desea absolutamente string valor, al igual que:

$value = (string)filter_input(INPUT_POST, 'value');
 25
Author: mpyw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-26 22:15:35

Es porque la variable 'us user_location' no está siendo definida. Si está utilizando cualquier bucle if dentro del cual está declarando la variable 'us 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 está satisfecho y en el bucle else 'us user_location' no se definió. Todavía se le pidió a PHP que hiciera eco de la variable. Así que 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;
 24
Author: Roger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-22 12:55:31

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 operen bajo el reporte de errores "predeterminado" de "Mostrar todos los errores, pero no 'avisos' y 'obsoletos'". Esto se establecerá en php.ini y 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 mostrado / grabado.

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

Lo que habrá sucedido en este caso es que el error_reporting se cambió para mostrar también los avisos (como por ejemplo) 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 actualizada de PHP ahora está usando un php diferente.ini de antes. Ese es el primer lugar para mirar.

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

  • .htconf (configuración del servidor web, incluyendo vhosts y sub-configuraciones) *
  • .htaccess
  • en el propio código php

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

También existe la complicación añadida de que la configuración del servidor web puede activar / desactivar .directivas htaccess, por lo que si tiene directivas en .htaccess que de repente se inicia / deja de funcionar, entonces usted necesita para comprobar que.

(.htconf / .htaccess asume 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

  • Compruebe las directivas de php error_reporting y display_errors en php.ini no ha cambiado, o que no está utilizando un diferente php.ini de antes.
  • Compruebe error_reporting y display_errors las directivas de php en .htconf (o vhosts etc) no han cambiado
  • Compruebe error_reporting y display_errors las directivas de php en .htaccess no han cambiado
  • Si tiene directiva en .htaccess, compruebe si todavía están permitidos en el .htconf file
  • Finalmente revise su código; posiblemente una biblioteca no relacionada; para ver si las directivas de php error_reporting y display_errors se han establecido allí.
 24
Author: Robbie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-23 01:44:03

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

$user_location = null;
 17
Author: Shahin Mammadzada,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-12 19:02:26

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

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

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

...¡Piénsalo de nuevo! Una mejor solución es:

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

(Uso una función personalizada html() para escapar caracteres, su kilometraje puede variar)

 15
Author: rybo111,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-28 19:12:50

Uso la función útil propia de todos los tiempos exst() que declara automáticamente las variables.

Su 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;
}
 13
Author: user2253362,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-09 14:07:38

En un Lenguaje muy Simple.
El error es que está utilizando una variable $user_location que no está definida por usted anteriormente y no tiene ningún valor, por lo que le recomiendo que por favor declare esta variable antes usando, Por Ejemplo:


$user_location = '';
O
$user_location = 'Los Angles';
Este es un error muy común que puede face.So no te preocupes solo declara la variable y Disfruta Codificando.
 13
Author: Rishabh Seth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-18 11:06:24

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

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

Es igual a:

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

Manual de PHP PHP 7.0

 12
Author: Lachezar Lechev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-13 13:34:57

¿Por qué no mantener las cosas simples?

<?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

?>
 7
Author: gts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-06 20:37:30

¿POR QUÉ SUCEDE ESTO?

Con el tiempo, PHP se ha convertido en un lenguaje más centrado en la seguridad. Los ajustes que solían estar desactivados por defecto ahora están activados por defecto. 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, por defualt, E_NOTICE está deshabilitado en php.ini. Los documentos de PHP recomiendan activarlo para fines de depuración. Sin embargo, cuando descargo PHP desde Ubuntu repositorio-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

Observe que error_reporting en realidad se establece en el valor de producción por defecto, no en el valor "por defecto" por defecto. Esto es algo confuso y no está documentado fuera de php.ini, así que tengo no validado esto en otras distribuciones.

Para responder A su pregunta, sin embargo, este error aparece ahora cuando no aparecer antes porque:

  1. Instalaste PHP y la nueva configuración por defecto está algo mal documentada, pero no excluye E_NOTICE.

  2. E_NOTICE advertencias como variables indefinidas e índices indefinidos en realidad ayudan a hacer que su código sea más limpio y seguro. Puedo decirles que, hace años, mantener E_NOTICE habilitado me obligó a declarar mis variables. Hizo mucho más fácil aprender C, donde no declarar variables es mucho más molesto.

¿QUÉ PUEDO HACER AL RESPECTO?

  1. Apague E_NOTICE por copiando el" valor predeterminado " E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED y reemplazándolo con lo que está actualmente sin comentar después del signo igual en error_reporting =. Reinicie Apache, o PHP si usa CGI o FPM. Asegúrese de que está editando el php "correcto".ini. 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 código heredado que va a ser extremadamente difícil de editar, entonces podría ser el mejor apostar.

  2. Desactive 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 lo contrario. Para hacer esto, debe consultar Apache2, nginx o cualquiera que sea su servidor de elección. En Apache, usarías php_value dentro de <Directory>.

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

Para ampliar la opción 3: Este es el ideal. Si puedes seguir esta ruta, deberías. Si no va a ir por esta ruta inicialmente, considere mover esta ruta eventualmente probando su código en un entorno de desarrollo. Mientras estás en ello, deshazte de ~E_STRICT y ~E_DEPRECATED para ver qué podría salir mal en el futuro. Vas a ver un MONTÓN de errores desconocidos, pero va a 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 null. Sin embargo, ¿en qué escenario necesitaría verificar una variable antes de que se definiera? En última instancia, este es un argumento para el "código descuidado". Como desarrollador, puedo decirte que me encanta cuando veo un proyecto de código abierto donde las variables se definen tan alto en sus ámbitos como se pueden definir. Hace que sea más fácil saber qué variables van a aparecer en el futuro, y hace que sea más fácil leer/aprender el 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 comprobació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. Este 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 serie 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 una vim persona en estos días:).
 7
Author: smcjones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-28 23:01:31

Undefined index significa que en un array usted solicitó un índice de array no disponible por ejemplo

<?php 

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

?>

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

<?php print_r($myvar); ?>

Undefined offset significa en array que ha pedido una clave no existente. Y el solución para esto es comprobar antes de usar

php> echo array_key_exists(1, $myarray);
 5
Author: Sintayehu Abaynhe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-30 01:02:18

Respecto a esta parte de la pregunta:

Por Qué aparecen de repente? Solía usar este guión durante años y nunca he tenido ningún problema.

No hay respuestas definitivas, pero aquí hay algunas explicaciones posibles de por qué los ajustes pueden 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 ajustes relevantes en tiempo de ejecución usando ini_set() o error_reporting() (busque estos en el código)

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

  4. Por lo general, los avisos no se muestran / informan (ver manual de PHP) así que es posible que al configurar el servidor, php.el archivo ini no se pudo cargar por alguna razón (archivo los permisos??) y usted estaba en la configuración predeterminada. Más tarde, el' bug ' ha sido resuelto (por accidente) y ahora PUEDE cargar el php correcto.archivo ini con el conjunto error_reporting para mostrar avisos.

 3
Author: Wouter de Winter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-28 19:31:39

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;
    }
}
 2
Author: John Conde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-20 11:44:13

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 intenta 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 un bucle while:

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 sistema operativo *NIX y Mac OS X, las cosas distinguen entre mayúsculas y minúsculas.

Consulte las siguientes preguntas y respuestas en Stack:

 2
Author: Fred -ii-,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-25 10:15:26

Usar un ternario {[13] } 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 cualquier valor predeterminado que necesite):

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

PHP 7+
Lo mismo excepto usando Null Coalescing Operator. Ya no hay necesidad de llamar a isset() ya que esto está integrado, y no hay necesidad de proporcionar la variable a devolver, ya que se supone que devuelve valor de la variable que se comprueba:

$newVariable = $thePotentialData ?? null;

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

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

 
Si no requiere establecer una nueva variable, puede usar directamente el valor devuelto del ternario, como con echo, argumentos de función, etc.:

Echo:

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á igual con los arrays, incluyendo sesiones, etc., reemplazando la variable que se comprueba con p.ej.:
$_SESSION['checkMe']
o cuantos niveles de profundidad necesites, p.ej.:
$clients['personal']['address']['postcode']


 

Supresión:

Es posible suprimir los Avisos de PHP con @ o reducir su nivel de reporte de errores, pero no soluciona el problema, simplemente deja de ser reportado en el registro de errores. Esto significa que su código aún intentó usar una variable que no estaba establecida, que puede o no significa que algo no funciona según lo previsto, dependiendo de lo crucial que sea el valor que falta.

Realmente debería estar comprobando este problema y manejándolo apropiadamente, 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 podría ignorar el registro de errores.

 1
Author: James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-06 18:56:38

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

 0
Author: phvish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-30 09:08:24

Cuando se trata de archivos, se requiere un enctype adecuado y un método POST, que activará un aviso de índice indefinido si no se incluyen 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:

 0
Author: Funk Forty Niner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-07 12:21:51

Una causa común de que una variable no exista después de enviar un formulario HTML es que el elemento del formulario no está contenido dentro de una etiqueta <form>:

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 dentro del <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>
 0
Author: John Conde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-05 20:46:04

Hice una pregunta sobre esto y me remitieron a este post con el mensaje:

Esta pregunta ya tiene una respuesta aquí:

"Notice: Undefined variable", "Notice: Undefined index", y " Notice: Desplazamiento indefinido " usando PHP

Estoy compartiendo mi pregunta y solución aquí:

Este es el error:

introduzca la descripción de la imagen aquí

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 el problema es que estoy escribiendo si 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? Segundo, 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 array $citiesCounterArray, pero que no es siempre el caso basado en los datos de mi bucle. Lo que necesito es establecer una condición para que si $key existe en la matriz, 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)){
 0
Author: Jaime Montoya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-01 18:31:57

Esos avisos se deben a que no tiene la variable utilizada defined y la clave my_index no estaba presente en la variable $my_array.

Esos avisos se activaron cada vez, porque su code no es correcto, pero probablemente no tenía el reporte de avisos activado.

Resolver 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 manera de sacar esto:

ini_set("error_reporting", false)
 -1
Author: Andrei Todorut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-25 13:09:56

En PHP necesitas fist para definir la variable después de que puedas usarla.
Podemos comprobar 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";
}
 -1
Author: Manish Goswami,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-17 02:43:09