Solución Warning: Undefined array key PHP
La solución Warning: Undefined array key php se presenta en formularios PHP cuando se envía la información para su proceso, ya sea inserción en base de datos o recuperación de variables.
Cuando deseamos obtener la información de un input en PHP mediante el método $_GET y un array, nos suele presentar un tipo de error PHP llamado Warning esto indica que la variable no está definida, a continuación, el código:
<form action="" method="GET">
<label>Usuario:</label><br>
<input type="text" name="txtusuario"><br>
<label>Email:</label><br>
<input type="text" name="txtemail"><hr>
<input type="submit" name="submit" vlaue="Agregar">
<a href="index.php">Volver</a>
</form>
<?php
include 'conexion.php';
$user=$_GET['txtusuario'];
$email=$_GET['txtemail'];
if($user!=null || $email!=null){
$sql="INSERT INTO users('ID','Usuario','Email') VALUES('.$user.','.$email.','')";
mysqli_query($sql);
if ($user=1) {
header("location:index.php");
}
}
?>
El error que genera e imprime lo siguiente:
Warning: Undefined array key "txtusuario" in C:\xampp\htdocs\adm\agregar.php on line 17
Warning: Undefined array key "txtemail" in C:\xampp\htdocs\adm\agregar.php on line 18
¿Cuál sería la solución?
Vamos a detallar 3 soluciones concretas para estos mensajes de advertencias que debemos de corregir.
- Primera solución: Función ISSET
- Segunda Solución: operador de fusión de null
- Tercera forma: Operador Ternario
Veamos las 3 soluciones.
Primera solución: Función ISSET
Para que el error desaparezca podemos apalancarnos de la función ISSET de PHP para validar valores procesados de formularios HTML
if (isset($_GET['usuario'])) {
}
Segunda Solución: operador de fusión de null
En este ejemplo si alguno de los valores esta vacío, la variable tendrá el valor null
. Luego en el if
verificamos en positivo, para menos confusiones.
Desde PHP 7+ puedes usar el operador de fusión de null de este modo:
<?php
include 'conexion.php';
$usuario=$_GET['txtusuario'] ?? null;
$email=$_GET['txtemail'] ?? null;
if($usuario&& $email){
$sql="INSERT INTO users(ID,Usuario,Email) VALUES('$usuario','$email','')";
mysqli_query($sql);
if ($user=1) {
header("location:index.php");
}
}
?>
Tercera forma: Operador Ternario
En PHP anterior a la versión 7 puedes usar un operador ternario, porque en esas versiones no existe fusión de null:
<?php
include 'conexion.php';
$usuario =!empty($_GET['txtusuario']) ? $_GET['txtusuario'] : null;
$email=!empty($_GET['txtemail']) ? $_GET['txtemail'] : null;
if($usuario && $email){
$sql="INSERT INTO users(ID,Usuario,Email) VALUES('$usuario','$email','')";
mysqli_query($sql);
if ($user=1) {
header("location:index.php");
}
}
?>
El método es el mismo, sólo que hay que verificar con la función empty()
si hay datos o no en la variable PHP.
Al momento de enviar un formulario, los inputs que no tienen datos no son enviados, por tanto, si intentas recuperar alguno de esos datos no enviados tendrás un mensaje de advertencia tipo: Undefined index
, como de hecho ocurre en este ejemplo.
Conclusiones y recomendaciones
Tu código es altamente vulnerable a ataques de inyección SQL, considera usar consultas preparadas para neutralizar ese grandísimo agujero de seguridad.
En versiones anteriores de PHP se usaba isset()
para controlar esta situación, de hecho, por lo general te sugerirán su uso y en la mayoría de tutoriales verás esa práctica.
Por lo tanto, usar isset()
no está mal, no está prohibido, solo que es un método antiguo. Sin embargo, el lenguaje PHP cambio mucho desde PHP 7 y más aún en versiones PHP 8+.
Ahora las cosas son mas más simples. Por lo tanto, esto significa que hay formas más elegantes, más limpias y más modernas de resolver estos tipos de advertencias en PHP.
Buenas tardes, se agradece sus alcances, una consulta al imprimir los registros de la consulta id_fac, if_area, nom_fac, sale error: Warning: Undefined array key «id_fac» in C:\laragon\www\RUI\report_facultad.php on line 44,…45….46