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

Estoy ejecutando un script PHP y continúo recibiendo errores como:

Aviso: variable no definida: mi_nombre_variable 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

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 script durante años y nunca tuve ningún problema.

¿Cómo los arreglo?

Esta es una pregunta 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.

Meta discusión relacionada:

  • ¿Qué se puede hacer con las preguntas repetitivas?
  • ¿Las “preguntas de referencia” tienen sentido?

Aviso: variable indefinida

De la gran 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 gran riesgo de seguridad 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 la matriz no inicializada. La construcción de lenguaje isset () se puede usar para detectar si una variable ya se ha inicializado. Además, y más ideal es la solución de empty () ya que no genera un mensaje de advertencia o error si la variable no se inicializa.

De la documentación de PHP :

No se genera ninguna advertencia si la variable no existe. Eso significa que empty () es esencialmente el equivalente concisa de ! Isset ($ var) || $ var == falso .

Esto significa que puede usar solo empty() para determinar si la variable está configurada, y además verifica la variable contra 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 de arriba en el editor PHP en línea de 3v4l.org

Aunque PHP no requiere una statement de variables, sí lo recomienda para evitar algunas vulnerabilidades de seguridad o errores donde uno olvidará dar un valor a una variable que se utilizará más adelante en el script. Lo que hace PHP en el caso de las variables no declaradas es emitir un error de nivel muy bajo, E_NOTICE , uno que ni siquiera se informa de manera predeterminada, pero el Manual aconseja permitirlo durante el desarrollo.

Maneras de lidiar con el problema:

  1. Recomendado: declare sus variables, por ejemplo, cuando intente agregar una cadena a una variable indefinida. O use isset() / !empty() isset() para verificar 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 puedes usar el operador nulo coalesce :

     // Null coalesce operator - No need to explicitly initialize the variable. $value = $_POST['value'] ?? ''; 
  2. Establezca un controlador de error personalizado para E_NOTICE y redirija los mensajes fuera del resultado estándar (tal vez a un archivo de registro):

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

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

Nota: Se recomienda encarecidamente implementar solo el punto 1.

Aviso: Índice indefinido / Desviación no definida

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

Maneras de lidiar con el problema:

  1. Verifique 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 list() construcción de 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 , por lo que generará:

Aviso: compensación indefinida: 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 usarlo. Para $_SESSION , debe asegurarse de que la sesión haya comenzado con session_start() y que el índice también exista.

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

Q1: este aviso significa que $ varname no está definido en el scope 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 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:

Error display @ operador

Para notificaciones no deseadas y redundantes, se podría usar el operador @ dedicado para » ocultar « mensajes de variable / índice indefinidos.

 $var = @($_GET["optional_param"]); 
  • Esto generalmente 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 parámetros de funciones o en bucles.
  • Hay una ventaja sobre el isset?: o ?? super-supresión sin embargo. Los avisos aún pueden ser registrados. Y uno puede resucitar avisos @ -hidden 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 esos errores tipográficos. Simplemente te priva de avisos de PHP para esos mismos casos. Agregue @ o isset solo después de verificar la funcionalidad.
    • Arregla la causa primero. No los avisos.

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

Y como esto cubre la mayoría de estas preguntas, ampliemos las causas más comunes:

$_GET / $_POST / $_REQUEST Entrada no definida

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

    • ¿Es este un nombre clave esperado y presente en cada solicitud de página?
    • Los nombres de las variables y los índices de las matrices 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 original:

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

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

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

    herramientas de desarrollador de navegador / pestaña de red

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

  • Para $_GET parámetros de $_GET , también puede consultar QUERY_STRING en

     print_r($_SERVER); 

    PHP tiene algunas reglas para fusionar nombres de parámetros no estándar en los superglobales. Apache podría hacer algo de reescritura también. También puede ver las $_COOKIES brutos $_COOKIES y otros encabezados de solicitud HTTP de esa manera.

  • Obviamente, mira la barra de direcciones de tu navegador para ver los parámetros GET :

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

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

  • Finalmente verifique sus declaraciones

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

    • Asegúrese de que cada entrada requerida tenga un
    • El atributo id= or title= no es suficiente.
    • Un method=POST 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 través de $ _GET y el method=POST restante method=POST campos method=POST en $ _POST junto.
    • Con las configuraciones modernas de PHP (≥ 5.6) se ha vuelto factible (no está de moda) $_REQUEST['vars'] a usar $_REQUEST['vars'] , que mapea los parámetros GET y POST.
  • Si está utilizando mod_rewrite, entonces debe verificar tanto access.log como habilitar RewriteLog para descubrir los parámetros ausentes.

$_FILES

  • Las mismas verificaciones de cordura se aplican a las cargas de archivos y $_FILES["formname"] .
  • Además, compruebe si hay enctype=multipart/form-data
  • Además del method=POST en su statement

    .

  • Ver también: PHP Error de índice no definido $ _FILES?

$_COOKIE

  • La matriz $_COOKIE nunca se rellena inmediatamente después de setcookie() , sino solo en cualquier solicitud HTTP de seguimiento.
  • Además, su validez se agota, podrían restringirse a subdominios o rutas individuales, y el usuario y el navegador pueden simplemente rechazarlos o eliminarlos.

Significa que está probando, evaluando o imprimiendo una variable a la que todavía no le ha asignado nada. Significa que tienes un error tipográfico o que primero debes verificar que la variable se haya inicializado. Verifique sus rutas lógicas, puede establecerse en una ruta pero no en otra.

En general, debido a la “mala progtwigció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 algunas veces, if (isset($varname)) : if (isset($varname)) , antes de usarlo
  3. Si es porque lo deletreaste mal, solo corrige eso
  4. Tal vez incluso el cambio de las advertencias en su configuración de PHP

No quise deshabilitar 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:

  

Para elementos de matriz:

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

En la página si quiero referirme a $ _REQUEST [‘name’]:

  

La mejor forma de obtener una cadena de entrada 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 desea absolutamente valor de cadena , al igual que:

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

Es porque la variable ‘$ user_location’ no se está definiendo. Si está utilizando cualquier 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 está satisfecho y en el bucle else ‘$ user_location’ no está definido. Aún así, se le pidió a PHP que hiciera eco de la variable. Entonces, 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; 

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

Es muy común que la mayoría de los sitios operen con el informe de error “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 en el servidor. Esto significa que esos “avisos” utilizados en los ejemplos serán suprimidos (ocultos) mientras que otros errores, considerados más críticos, serán mostrados / grabados.

La otra configuración crítica es que los errores pueden ocultarse (es decir, display_errors establecido en “off” o “syslog”).

Lo que habrá sucedido en este caso es que o bien el error_reporting fue cambiado para mostrar 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 actualizada de PHP ahora está usando un php.ini diferente desde antes. Ese es el primer lugar para mirar.

Sin embargo, también es posible anular estas configuraciones en

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

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

También existe la complicación adicional de que la configuración del servidor web puede habilitar / deshabilitar las directivas .htaccess, por lo que si tiene directivas en .htaccess que repentinamente inician / dejan de funcionar, debe verificarlo.

(.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, entonces deberá verificar esas configuraciones en consecuencia)

Resumen

  • Compruebe error_reporting y display_errors directivas php en php.ini no han cambiado, o que no está usando un php.ini diferente desde antes.
  • Comprobar error_reporting y display_errors directivas php en .htconf (o vhosts, etc.) no han cambiado
  • Compruebe error_reporting y display_errors directivas php en .htaccess no han cambiado
  • Si tiene una directiva en .htaccess, verifique si todavía están permitidos en el archivo .htconf
  • Por último revisa tu código; posiblemente una biblioteca no relacionada; para ver si las directivas error_reporting y display_errors php se han establecido allí.

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

 $user_location = null; 

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

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

 // Echo whatever the hell this is  

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

 // If this is set, echo a filtered version  

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

Utilizo todo el tiempo la propia función útil exst () que declara automáticamente las variables.

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; } 

En un lenguaje muy simple .
El error es que está usando una $user_location variable que no definió anteriormente y no tiene ningún valor. Por lo tanto, le recomiendo declarar esta variable antes de usarla , por ejemplo:


$user_location = '';
O
$user_location = 'Los Angles';


Este es un error muy común que puede enfrentar. Así que no se preocupe, simplemente declare la variable y disfrute de la encoding .

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

¿Por qué no mantener las cosas simples?

  

¿POR QUÉ ESTÁ PASANDO ESTO?

Con el tiempo, PHP se ha convertido en un lenguaje más centrado en la seguridad. La configuración que solía estar desactivada de forma predeterminada ahora está activada de manera predeterminada. Un ejemplo perfecto de esto es E_STRICT , que se activó por defecto a partir de PHP 5.4.0 .

Además, de acuerdo con la documentación de PHP, por defualt, E_NOTICE está deshabilitado en php.ini. Los documentos PHP recomiendan activarlo para fines de depuración . Sin embargo, cuando descargo PHP del repository de Ubuntu y de la stack 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 

Tenga en cuenta que error_reporting está establecido en el valor de producción de manera predeterminada, no en el valor “predeterminado” de manera predeterminada. Esto es algo confuso y no está documentado fuera de php.ini, por lo que no he validado esto en otras distribuciones.

Para responder a su pregunta, sin embargo, este error aparece ahora cuando no apareció antes porque:

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

  2. E_NOTICE advertencias E_NOTICE como variables indefinidas e índices indefinidos realmente ayudan a 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. Desactive E_NOTICE copiando el “Valor predeterminado” E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED y reemplazándolo con lo que no está actualmente sincronizado después del signo igual en error_reporting = . Reinicie Apache, o PHP si usa CGI o FPM. Asegúrese de estar editando el php.ini “correcto”. El correcto será Apache si está ejecutando PHP con Apache, fpm o php-fpm si 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 funcionar. ser extremadamente difícil de editar, entonces podría ser tu mejor apuesta.

  2. Desactive E_NOTICE en el nivel de archivo o carpeta. Esto podría ser preferible si tiene algún código heredado pero quiere hacer las cosas de la manera “correcta” de lo contrario. Para hacer esto, debe consultar Apache2, nginx o el servidor que elija. En Apache, usaría php_value dentro de .

  3. Reescribe tu código para estar 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 deshabilitar cualquier visualización de errores y solo registrar sus errores (vea log_errors y log_errors en php.ini y su Configuración del servidor).

Para expandir la opción 3: este es el ideal. Si puedes ir por esta ruta, deberías. Si no va por esta ruta inicialmente, considere mover esta ruta con el tiempo probando su código en un entorno de desarrollo. Mientras lo hace, deshágase 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 del 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 definiera? En definitiva, este es un argumento para “código descuidado”. Como desarrollador, puedo decirle que me encanta cuando veo un proyecto de código abierto donde las variables se definen como de alto nivel en sus ámbitos, ya que se pueden definir. Hace que sea más fácil 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 : 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 un conjunto vacío 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 encontré con estos y otros problemas, utilicé 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 a excepción de proyectos grandes. Soy más una persona vim en estos días :).

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

  

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

  

offset indefinido significa en conjunto 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); 

Respecto a esta parte de la pregunta:

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

No hay respuestas definitivas, pero aquí hay algunas posibles explicaciones de por qué las configuraciones pueden cambiar “de repente”:

  1. Has actualizado PHP a una versión más nueva 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 el tiempo de ejecución utilizando ini_set() o error_reporting() (busque estos en el código)

  3. Cambió la configuración del servidor web (suponiendo que Apache esté aquí): los archivos .htaccess y las configuraciones de vhost también pueden manipular las configuraciones de php.

  4. Por lo general, los avisos no se muestran / informan (consulte el manual de PHP ), por lo que es posible que al configurar el servidor, el archivo php.ini no se haya podido cargar por algún motivo (¿permisos de archivo?) Y usted estaba en la configuración predeterminada . Más tarde, el ‘error’ fue resuelto (por accidente) y ahora PUEDE cargar el archivo php.ini correcto con el conjunto error_reporting para mostrar notificaciones.

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

 class Person { protected $firstName; protected $lastName; public function setFullName($first, $last) { // Correct $this->firstName = $first; // Incorrect $lastName = $last; // Incorrect $this->$lastName = $last; } } 

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 ciclo while:

 while( $row = fetching_function($query) ) { echo $row['col1']; echo "
"; echo $row['col2']; // undefined index thrown echo "
"; echo $row['col3']; // undefined index thrown }

Otra cosa que debe tenerse en cuenta es que en un sistema operativo * NIX y Mac OS X, las cosas son sensibles a las mayúsculas y minúsculas.

Consulte las siguientes preguntas y respuestas en Stack:

  • ¿Son sensibles las mayúsculas y minúsculas en MySQL?

  • mysql nombres de tabla sensibles a mayúsculas y minúsculas en consultas

  • MySql – Problema de mayúsculas y minúsculas de tablas en servidores diferentes

Usar un ternario es simple, legible y limpio:

Pre PHP 7
Asigne una variable al valor de otra variable si está configurada; de lo contrario, asigne null (o el valor predeterminado que necesite):

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

PHP 7+
Lo mismo excepto que usa el Operador de fusión nulo . Ya no es necesario llamar a isset() ya que está integrado, y no es necesario proporcionar la variable para devolver, ya que se supone que devuelve el valor de la variable que se 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 necesita establecer una nueva variable, puede usar directamente el valor devuelto por el ternario, como por ejemplo con echo , argumentos de funciones, 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 verifica con, por ejemplo:
$_SESSION['checkMe']
o cuantos niveles profundos necesite, por ejemplo:
$clients['personal']['address']['postcode']


Supresión:

It is possible to suppress the PHP Notices with @ or reduce your error reporting level, but it does not fix the problem , it simply stops it being reported in the error log. This means that your code still tried to use a variable that was not set, which may or may not mean something doesn’t work as intended – depending on how crucial the missing value is.

You should really be checking for this issue and handling it appropriately, either serving a different message, or even just returning a null value for everything else to identify the precise state.

If you just care about the Notice not being in the error log, then as an option you could simply ignore the error log.

Probably you were using old PHP version until and now upgraded PHP thats the reason it was working without any error till now from years. until PHP4 there was no error if you are using variable without defining it but as of PHP5 onwards it throws errors for codes like mentioned in question.

When dealing with files, a proper enctype and a POST method are required, which will trigger an undefined index notice if either are not included in the form.

The manual states the following basic syntax:

HTML

  
Send this file:

PHP

 '; 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 "

"; ?>

Referencia:

One common cause of a variable not existing after an HTML form has been submitted is the form element is not contained within a

tag:

Example: Element not contained within the

 

Example: Element now contained within the

 

I asked a question about this and I was referred to this post with the message:

Esta pregunta ya tiene una respuesta aquí:

“Notice: Undefined variable”, “Notice: Undefined index”, and “Notice: Undefined offset” using PHP

I am sharing my question and solution here:

This is the error:

enter image description here

Line 154 is the problem. This is what I have in line 154:

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

I think the problem is that I am writing if conditions for the variable $city , which is not the key but the value in $key => $city . First, could you confirm if that is the cause of the warning? Second, if that is the problem, why is it that I cannot write a condition based on the value? Does it have to be with the key that I need to write the condition?

UPDATE 1: The problem is that when executing $citiesCounterArray[$key] , sometimes the $key corresponds to a key that does not exist in the $citiesCounterArray array, but that is not always the case based on the data of my loop. What I need is to set a condition so that if $key exists in the array, then run the code, otherwise, skip it.

UPDATE 2: This is how I fixed it by using array_key_exists() :

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

Those notices are because you don’t have the used variable defined and my_index key was not present into $my_array variable.

Those notices were triggered every time, because your code is not correct, but probably you didn’t have the reporting of notices on.

Solve the bugs:

 $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 } 

Another way to get this out:

 ini_set("error_reporting", false) 

In PHP you need fist to define the variable after that you can use it.
We can check variable is defined or not in very efficient way!.

 //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)){ } 

Simple Explanation

 //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"; }