variable solucion index error array _post php arrays variables warnings undefined-index

solucion - “Aviso: Variable no definida”, “Aviso: Índice no definido” y “Aviso: Desplazamiento indefinido” utilizando PHP



undefined variable laravel (28)

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 riesgo de seguridad importante con register_globals activado. Se emite un error de nivel E_NOTICE en caso de trabajar con variables no inicializadas, pero no en el caso de elementos anexos a la matriz no inicializada. isset() constructo 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 está inicializada.

De la empty() :

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

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

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

Maneras de tratar el problema:

  1. Recomendado: declare sus variables, por ejemplo, cuando intenta agregar una cadena a una variable no definida. 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 puede usar el operador de fusión nula :

    // Null coalesce operator - No need to explicitly initialize the variable. $value = $_POST[''value''] ?? '''';

  2. Establezca un controlador de errores personalizado para E_NOTICE y redirija los mensajes fuera de la salida estándar (tal vez a un archivo de registro):

    set_error_handler(''myHandlerForMinorErrors'', E_NOTICE | E_STRICT)

  3. Desactiva E_NOTICE de los informes. Una forma rápida de excluir solo E_NOTICE es:

    error_reporting( error_reporting() & ~E_NOTICE )

  4. Suprimir el error con el operador @ .

Nota: Se recomienda encarecidamente implementar solo el punto 1.

Aviso: índice indefinido / desplazamiento indefinido

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

Maneras de tratar 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 list() construcciones del lenguaje list() puede generar esto cuando intenta acceder a un índice de matriz que no existe:

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

Se usan dos variables para acceder a dos elementos de matriz, sin embargo, solo hay un elemento de matriz, índice 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 tiene que comprobar si el índice existe o no antes de usarlos. Para $_SESSION , debe asegurarse de haber iniciado la sesión con session_start() y de que el índice también exista.

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

Relacionado:

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

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

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

Las líneas 10 y 11 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 script durante años y nunca he tenido ningún problema.

¿Cómo los arreglo?

Esta es una pregunta de referencia general para que las personas la vinculen como duplicada, 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:


¿POR QUÉ ESTÁ PASANDO ESTO?

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

Además, según la documentación de PHP, por defecto, E_NOTICE está deshabilitado en php.ini. Los documentos PHP recomiendan activarlo para fines de depuración . Sin embargo, cuando descargo PHP desde el repositorio de Ubuntu, y desde 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 se establece realmente en el valor de producción de forma predeterminada, no en el valor "predeterminado" de forma predeterminada. Esto es algo confuso y no está documentado fuera de php.ini, así que no lo he validado en otras distribuciones.

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

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

  2. E_NOTICE advertencias E_NOTICE como variables no definidas e índices no definidos 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. Lo hizo mucho más fácil de aprender C, donde no declarar variables es una molestia mucho más grande.

¿QUÉ PUEDO HACER AL RESPECTO?

  1. Desactive E_NOTICE copiando el "Valor predeterminado" E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED y E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED por lo que actualmente no está comentado 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.ini "correcto". El correcto será Apache si está ejecutando PHP con Apache, fpm o php-fpm si está ejecutando PHP-FPM, cgi si está ejecutando PHP-CGI, etc. Este no es el método recomendado, pero si tiene un código heredado que va a Ser extremadamente difícil de editar, entonces podría ser 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 lo que sea el servidor de su elección. En Apache, usaría php_value dentro de <Directory> .

  3. Vuelve a escribir tu código para estar más limpio. Si necesita hacer esto mientras se está moviendo a un entorno de producción, o si no quiere que alguien vea sus errores, asegúrese de que está deshabilitando cualquier visualización de errores, y solo registrando sus errores (vea log_errors y log_errors en php.ini y su Configuración del servidor).

Para expandir en la opción 3: Este es el ideal. Si puedes ir por esta ruta, deberías. Si no va por esta ruta inicialmente, considere la posibilidad de mover esta ruta probando su código en un entorno de desarrollo. Mientras esté en ello, deshágase de ~E_STRICT y ~E_DEPRECATED para ver qué puede salir mal en el futuro. Verá MUCHOS errores desconocidos, pero le impedirá tener 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 última instancia, este es un argumento para "código descuidado". Como desarrollador, puedo decirte que me encanta cuando veo un proyecto de código abierto en el que las variables se definen en sus ámbitos como se pueden definir. Facilita saber qué variables aparecerán en el futuro y facilita la lectura / aprendizaje del código.

function foo() { $my_variable_name = ''''; //.... if ($my_variable_name) { // perform some logic } }

Undefined index: my_index : esto ocurre cuando intenta acceder a un valor en una matriz y no existe. Para evitar este error, realice una 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. Esto no siempre es posible.

$my_array = array( ''my_index'' => '''' ); //... $my_array[''my_index''] = ''new string'';

(consejo adicional)

  • Cuando tuve 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 de una persona vim estos días :).

Visualizador de error @ operador

Para avisos no deseados y redundantes, uno podría usar el operador @ dedicado para » ocultar « mensajes de índice / variable no definidos.

$var = @($_GET["optional_param"]);

  • Esto suele ser desalentado. Los recién llegados tienden a abusar de él.
  • Es muy inadecuado para el código que se encuentra dentro de la lógica de la aplicación (ignorar las variables no declaradas donde no debería), por ejemplo, para parámetros de funciones o en bucles.
  • Hay un lado positivo sobre el isset?: o ?? Supersupresión sin embargo. Los avisos todavía pueden ser registrados. Y uno puede resucitar @ avisos ocultos con: set_error_handler("var_dump");
    • Además, no debe usar / recomendar habitualmente if (isset($_POST["shubmit"])) en su código inicial.
    • Los recién llegados no van a detectar esos errores tipográficos. Simplemente te priva de los avisos de PHP para esos casos. Agregar @ 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 dado que esto cubre la mayoría de estas preguntas, expandamos las causas más comunes:

$_GET / $_POST / $_REQUEST entrada no definida

  • Lo primero que hace cuando se encuentra con un índice / desplazamiento no definido, es verificar los errores tipográficos:
    $count = $_GET["whatnow?"];

    • ¿Es este un nombre de clave esperado y está presente en cada solicitud de página?
    • Los nombres de variables y las indicaciones de matriz 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 con algún parámetro.

  • De forma alternativa o adicional, utilice los controles de su navegador ( F12 ) e inspeccione la pestaña de la red en busca de solicitudes y parámetros:

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

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

    print_r($_SERVER);

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

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

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

    Los pares name=value después de ? Los signos 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 <form> y <input> , si espera un parámetro pero no recibe ninguno.

    • Asegúrese de que cada entrada requerida tenga un <input name=FOO>
    • El atributo id= o title= no es suficiente.
    • Un method=POST formulario method=POST debe llenar $_POST .
    • Mientras que un method=GET (o dejarlo fuera) generarí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 al lado.
    • Con las configuraciones modernas de PHP (≥ 5.6), se ha vuelto feasible (no está de moda) usar $_REQUEST[''vars''] nuevamente, que combina los parámetros GET y POST.
  • Si está utilizando mod_rewrite, debe verificar tanto el access.log como habilitar el RewriteLog para averiguar los parámetros ausentes.

$_FILES

  • Las mismas comprobaciones de validez se aplican a las cargas de archivos y $_FILES["formname"] .
  • Por otra parte, compruebe para enctype=multipart/form-data
  • Así como method=POST en su declaración <form> .
  • Véase también: PHP Undefined index error $ _FILES?

$_COOKIE

  • La matriz $_COOKIE nunca se llena justo después de setcookie() , pero solo en cualquier solicitud HTTP de seguimiento.
  • Además, su validez expira, pueden limitarse a subdominios o rutas individuales, y el usuario y el navegador pueden simplemente rechazarlos o eliminarlos.

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

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

variable no definida significa que ha usado una variable completamente no existente o que no está definida o inicializada con ese nombre, por ejemplo

<?php print_r($myvar); ?>

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

php> echo array_key_exists(1, $myarray);


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


En PHP 7.0 ahora es posible utilizar 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


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

$user_location = '''';
O
$user_location = ''Los Angles''; Este es un error muy común que puede enfrentar. No se preocupe, solo declare la variable y disfrute la codificación .

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

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

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

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


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

  1. Si es un error, primero realice una asignación adecuada a la variable: $ varname = 0;
  2. Si realmente solo está definido algunas veces, if (isset($varname)) : if (isset($varname)) , antes de usarlo
  3. Si es porque lo escribiste mal, simplemente corrige eso
  4. Tal vez incluso desactivar las advertencias en su configuración de PHP

La mejor manera de obtener la 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 absolutamente quieres valor de cadena , al igual que:

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


No quería 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 $ nombre y eco 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 referirme a $ _REQUEST [''nombre'']:

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


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

Es decir:

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

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

Es decir:

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

o en 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 }

Otra cosa 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 la pila:


Prueba estos

Q1: 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:


Respecto a esta parte de la pregunta:

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

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

  1. Ha 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 la configuración relevante en tiempo de ejecución utilizando ini_set() o error_reporting() (busque estos en el código)

  3. Cambió la configuración del servidor web (asumiendo apache aquí): los archivos .htaccess y las configuraciones vhost también pueden manipular la configuración 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 pueda cargarse por algún motivo (¿permisos de archivo?) Y se encuentre en la configuración predeterminada . Más tarde, el ''error'' se resolvió (por accidente) y ahora PUEDE cargar el archivo php.ini correcto con el error_reporting configurado para mostrar avisos.


Si está trabajando con clases, debe asegurarse de hacer referencia a las variables de 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; } }


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


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

Por ejemplo, si pensaste que esto era inteligente, código de taquigrafía:

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

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

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

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


Usar un ternary es simple, legible y limpio:

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

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

PHP 7+
Lo mismo, excepto el uso del operador coalescente nulo . Ya no es necesario llamar a isset() ya que está integrado, y no es necesario proporcionar la variable para devolverla, ya que se supone que devuelve el valor de la variable que se está verificando:

$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 configurar una nueva variable, entonces puede usar directamente el valor devuelto del ternario, como con echo , argumentos de función, etc.

Eco:

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

Función:

$foreName = getForeName(isset($userId) ? $userId : null); function getForeName($userId) { if ($userId === null) { // Etc } }

Lo anterior funcionará igual con los arreglos, incluidas las sesiones, etc., reemplazando la variable que se está verificando con, por ejemplo:
$_SESSION[''checkMe'']
o por muchos niveles que necesites, por ejemplo:
$clients[''personal''][''address''][''postcode'']

Supresión:

Es posible suprimir los avisos de PHP @o reducir su nivel de informe de errores, pero no soluciona el problema , simplemente impide que se informe en el registro de errores. Esto significa que su código aún trató de usar una variable que no se configuró, lo que puede o no significa que algo no funcione según lo previsto, dependiendo de lo importante que sea el valor faltante.

Realmente debería estar comprobando este problema y manejarlo de manera adecuada, ya sea para enviar un mensaje diferente o simplemente devolver un valor nulo para que todo lo demás identifique el estado preciso.

Si solo le importa que el Aviso no esté en el registro de errores, entonces como una opción, simplemente puede ignorar el registro de errores.


Uso toda la función útil exst () de todos los tiempos, 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; }


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

$user_location = null;


Diferentes tipos de errores.

1) Aviso: Variable indefinida

Recibirá este error si no ha definido la variable y está intentando acceder o usar esa variable.

Ejemplo:

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

2) Aviso: índice indefinido y desplazamiento indefinido

Significa que te estás refiriendo a una clave de matriz que no existe. "Compensar"

se refiere a la clave entera de una matriz numérica, y "índice" se refiere a la

clave de cadena de una matriz asociativa.

ini_set("error_reporting", false)


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

Es muy común que la mayoría de los sitios operen bajo el informe de error "predeterminado" de "Mostrar todos los errores, pero no ''avisos'' y ''en desuso''". Esto se establecerá en php.ini y se aplicará a todos los sitios en el servidor. Esto significa que los "avisos" utilizados en los ejemplos se suprimirán (ocultarán) mientras que otros errores, considerados más críticos, se mostrarán / registrarán.

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

Lo que habrá ocurrido en este caso es que se cambió el error_reporting para mostrar también avisos (como en los ejemplos) y / o que la configuración se cambió a display_errors en 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 al de antes. Ese es el primer lugar para mirar.

Sin embargo, también es posible anular esta configuración en

  • .htconf (configuración del servidor web, incluidos 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 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 comienzan / dejan de funcionar, entonces debe verificarlas.

(.htconf / .htaccess asume que se está ejecutando como apache. Si se ejecuta la línea de comandos, esto no se aplicará; si se ejecuta IIS u otro servidor web, entonces deberá verificar esas configuraciones en consecuencia)

Resumen

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

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

El manual establece la siguiente sintaxis básica:

HTML

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

PHP

<?php // In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead // of $_FILES. $uploaddir = ''/var/www/uploads/''; $uploadfile = $uploaddir . basename($_FILES[''userfile''][''name'']); echo ''<pre>''; if (move_uploaded_file($_FILES[''userfile''][''tmp_name''], $uploadfile)) { echo "File is valid, and was successfully uploaded./n"; } else { echo "Possible file upload attack!/n"; } echo ''Here is some more debugging info:''; print_r($_FILES); print "</pre>"; ?>

Referencia:


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

Esta pregunta ya tiene una respuesta aquí:

“Aviso: Variable no definida”, “Aviso: Índice no definido” y “Aviso: Desplazamiento indefinido” utilizando PHP

Estoy compartiendo mi pregunta y solución aquí:

Este es el error:

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

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

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

ACTUALIZACIÓN 1: El problema es que, al ejecutarse $citiesCounterArray[$key], a veces $keycorresponde a una clave que no existe en la $citiesCounterArraymatriz, pero no siempre es así en base a los datos de mi bucle. Lo que necesito es establecer una condición para que si $keyexiste en la matriz, luego ejecute el código, de lo contrario, omítalo.

ACTUALIZACIÓN 2: Así es como lo arreglé usando array_key_exists():

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


En PHP necesitas un puño para definir la variable después de que puedas usarla.
Podemos comprobar si la variable está definida o no de manera muy eficiente !.

//If you only want to check variable has value and value has true and false value. //But variable must be defined first. if($my_variable_name){ } //If you want to check variable is define or undefine //Isset() does not check that variable has true or false value //But it check null value of variable if(isset($my_variable_name)){ }

Explicación simple

//It will work with :- true,false,NULL $defineVarialbe = false; if($defineVarialbe){ echo "true"; }else{ echo "false"; } //It will check variable is define or not and variable has null value. if(isset($unDefineVarialbe)){ echo "true"; }else{ echo "false"; }


Esos avisos se deben a que no tiene la variable utilizada definedy la my_indexclave no estaba presente en la $my_arrayvariable.

Esos avisos se activaron cada vez, porque codeno es correcto, pero es probable que no haya informado de los avisos.

Resuelve los errores:

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

Otra forma de sacar esto:

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


Probablemente estabas usando la versión antigua de PHP hasta ahora, y ahora has actualizado PHP por ese motivo estaba funcionando sin ningún error hasta ahora, desde hace años. hasta PHP4 no hubo ningún error si está utilizando una variable sin definirla, pero a partir de PHP5 en adelante, arroja errores para códigos como los mencionados en la pregunta.


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

Ejemplo: Elemento no contenido dentro del <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>