Desarrollo de Aplicaciones PHP para Gestión de Usuarios y Configuración de Redes
Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones
Escrito el en
español con un tamaño de 8,01 KB
Revisión y Estructuración de Código PHP
El documento original presenta dos secciones de código PHP distintas y no relacionadas, una para la gestión de usuarios mediante un menú interactivo y otra para la modificación del archivo de configuración de red /etc/network/interfaces. A continuación, se presenta el código corregido, formateado y estructurado para mejorar su legibilidad y corrección sintáctica y ortográfica.
Parte 1: Sistema de Gestión de Usuarios (Agenda)
Este bloque implementa un sistema básico de **CRUD** (Crear, Leer, Actualizar, Eliminar) para gestionar usuarios, almacenados en un array asociativo donde la clave es el DNI.
#!/usr/bin/php
// Agenda de Juan Gavira Escrivá
<?php
/**
Función para leer la entrada estándar (STDIN).
@return string La cadena leída y limpia de espacios.
*/
function leer(): string
{
$cadena = "";
// Asegura que STDIN esté definido como un recurso de lectura
if (!defined("STDIN")) {
define("STDIN", fopen('php://stdin', 'r'));
}
$cadena = fread(STDIN, 1024);
return trim($cadena);
}/**
Muestra el menú principal y solicita una opción al usuario.
@return string La opción seleccionada.
*/
function menu(): string
{
system("clear"); // Limpia la consola
echo "\n--- Menú de Gestión de Usuarios ---\n";
echo "---------------------------------------------------\n";
echo "1. Dar de alta a un usuario.\n";
echo "2. Dar de baja a un usuario.\n";
echo "3. Consultar un usuario (se pedirá DNI).\n";
echo "4. Ver todos los usuarios.\n";
echo "---------------------------------------------------\n";
echo "5. Salir\n";
echo "Su opción: ";
$opcion = leer();
return $opcion;
}
/**
Elimina un usuario de la tabla usando su DNI.
@param array $tabla Referencia al array de usuarios.
@param string $dni El DNI del usuario a eliminar.
@return int Siempre retorna 0.
*/
function eliminar(array &$tabla, string $dni): int
{
if (isset($tabla[$dni])) {
unset($tabla[$dni]); // unset sirve para borrar variables/claves
echo "Se eliminó correctamente.\n";
} else {
echo "No existe DNI.\n";
}
sleep(2); // Espera 2 segundos antes de continuar
return 0;
}/**
Muestra todos los usuarios registrados.
@param array $tabla Referencia al array de usuarios.
@return int Siempre retorna 0.
*/
function verTodo(array &$tabla): int
{
if (empty($tabla)) {
echo "No hay usuarios registrados.\n";
} else {
echo "\n--- Listado de Usuarios ---\n";
foreach ($tabla as $clave => $valor) {
echo "DNI: {$clave} | Nombre: {$valor}\n";
}
}
return 0;
}// --- Inicialización y Bucle Principal ---
$tabla = []; // Inicializa el array de usuarios
$opcion = '';
// El bucle Do-While original se corrige a While para mejor práctica, aunque se mantiene la lógica de salida.
do {
$opcion = menu();
switch ($opcion) {
case '1':
system("clear");
echo "Introduce el nombre: ";
$nombre = leer();
echo "Introduce el DNI: ";
$dni = leer();
if (!empty($nombre) && !empty($dni)) {
$tabla[$dni] = $nombre;
ksort($tabla); // ksort() ordena el array por las claves (DNI)
echo "Usuario dado de alta.\n";
} else {
echo "Error: Nombre o DNI vacíos.\n";
}
sleep(2);
break;
case '2':
system("clear");
echo "Introduzca el DNI a eliminar: ";
$dni = leer();
eliminar($tabla, $dni);
break;
case '3':
system("clear");
echo "Introduzca el DNI a consultar: ";
$dni = leer();
if (isset($tabla[$dni])) {
echo "DNI: {$dni} | Nombre: {$tabla[$dni]}\n";
} else {
echo "No existe el DNI.\n";
}
sleep(2);
break;
case '4':
system("clear");
verTodo($tabla);
echo "\nPresione Enter para continuar...";
leer(); // Espera a que el usuario presione Enter
break;
case '5':
echo "Saliendo del sistema...\n";
break;
default:
echo "Opción no válida.\n";
sleep(2);
break;
}
} while ($opcion != '5');
?>
Parte 2: Script para Configuración de Redes
Esta sección parece ser un script independiente diseñado para modificar el archivo de configuración de red /etc/network/interfaces, solicitando IP, máscara y puerta de enlace.
Nota Importante: La ejecución de comandos como exec y la modificación directa de archivos de configuración del sistema (como /etc/network/interfaces) requieren **permisos de superusuario (root)** y deben manejarse con extrema precaución.
<?php
// CONFIGURAR /etc/network/interfaces
/**
Función para leer la entrada estándar (STDIN) con manejo de caracteres.
@return string La frase leída, sin el carácter de nueva línea final.
*/
function lee(): string
{
if (!defined("STDIN")) {
// Se corrige la ruta de 'http:/stdin' a 'php://stdin' o se mantiene la estructura original si se asume un entorno específico.
define("STDIN", fopen('php://stdin', 'r'));
}
$frase = fread(STDIN, 1024);
// Elimina el carácter de nueva línea final si existe
$tam = strlen($frase) - 1;
$nueva = "";
for ($i = 0; $i < $tam; $i++) {
$nueva .= $frase[$i];
}
return $nueva;
}// 1. Copia de seguridad del archivo original
exec("cp /etc/network/interfaces /etc/network/interfaces2");
// 2. Definición del patrón de validación IP (IPv4)
$patron = "^([0-9]{1,3}.){3}[0-9]{1,3}$";
// 3. Definición de tipos (aunque solo se usan los dos primeros datos en el bucle)
$tipo[0] = "ip";
$tipo[1] = "mascara";
$tipo[2] = "puerta de enlace";
$dato = [];
// 4. Apertura del archivo para escritura (se usará el archivo copiado para modificar)
$fichero = fopen("/etc/network/interfaces2", "w");
if ($fichero !== NULL) {
echo "Fichero abierto para escritura.\n";
// Solicitud de datos: IP y Máscara (el bucle original itera 2 veces, pero luego usa $dato[2] en el texto)
for ($i = 0; $i < 3; $i++) {
do {
$prompt = "Introduzca la dirección " . $tipo[$i] . ": ";
echo $prompt;
$dato[$i] = lee();
// Validación: Solo se valida la IP (índice 0) y la Máscara (índice 1) con el patrón.
if ($i === 0 || $i === 1) {
// Se usa preg_match en lugar de ereg (obsoleta)
if (!preg_match("/" . $patron . "/", $dato[$i])) {
echo "Error: Formato de dirección inválido. Inténtelo de nuevo.\n";
$dato[$i] = ""; // Limpia el dato si falla la validación
}
}
} while (empty($dato[$i]));
}
// 5. Construcción del texto de configuración
$texto = "auto eth0\n";
$texto .= "iface eth0 inet static\n";
$texto .= "\taddress " . $dato[0] . "\n";
$texto .= "\tnetmask " . $dato[1] . "\n";
$texto .= "\tgateway " . $dato[2] . "\n";
// 6. Escritura y cierre
fputs($fichero, $texto);
fclose($fichero);
echo "Fichero cerrado y datos escritos.\n";
// 7. Reinicio del servicio de red (requiere permisos)
echo "Reiniciando el servicio de networking...\n";
exec("/etc/init.d/networking restart");
} else {
echo "\nError al abrir el fichero /etc/network/interfaces2";
}
?>