Material para ampliar el proyecto UD4 MVC
Si has completado bien los requisitos mínimos del proyecto, quedarse de brazos cruzados es lo peor que puede hacer un informático curioso y con ganas de mejorar.
Te propongo aquí diferentes herramientas útiles para poder investigar y mejorar tu proyecto.
Una pequeña empresa llamada TechFlow, dedicada al desarrollo de software para pymes había creado un sistema básico basado en el modelo vista-controlador (MVC) que conectaba con una base de datos MySQL usando PDO.
El sistema estaba funcionando, pero al crecer su negocio, TechFlow enfrentó nuevas necesidades. Decidieron mejorar su proyecto y, para ello, exploraron las siguientes funciones útiles de PHP para ampliar su solución.
1-5: Gestión avanzada de bases de datos
PDO::prepare
ybindParam
: Permiten proteger las consultas SQL contra inyecciones SQL al preparar consultas y asociar parámetros dinámicamente. Necesidad: Evitar problemas de seguridad en entradas de usuario.PDO::beginTransaction
ycommit
: Habilitan transacciones para garantizar que un conjunto de operaciones se ejecute como un todo o no se ejecute en absoluto. Necesidad: Registrar múltiples operaciones en la base de datos, como facturas y pagos.PDO::rollBack
: Revertir una transacción en caso de error. Necesidad: Manejar errores en procesos críticos.PDO::lastInsertId
: Recuperar el ID del último registro insertado en una tabla. Necesidad: Obtener el ID de un cliente recién registrado para usarlo en otros procesos.fetchAll
: Recuperar múltiples filas de una consulta en un arreglo. Necesidad: Listar todos los pedidos o clientes.
6-10: Validación y sanitización de datos
filter_var
: Validar y sanitizar entradas, como correos electrónicos o URLs. Necesidad: Prevenir errores o datos no válidos al registrar usuarios.htmlspecialchars
: Escapar caracteres especiales en HTML. Necesidad: Proteger las vistas de ataques XSS.password_hash
ypassword_verify
: Manejar contraseñas de forma segura. Necesidad: Implementar un sistema de inicio de sesión seguro.ctype_digit
: Verificar si un valor contiene solo números. Necesidad: Validar IDs o datos numéricos antes de procesarlos.is_numeric
: Similar actype_digit
, pero permite valores como1.23
o1e5
. Necesidad: Validar precios o cantidades.
11-15: Optimización y manejo de archivos
file_put_contents
yfile_get_contents
: Guardar y leer datos de archivos. Necesidad: Manejar configuraciones simples o logs del sistema.json_encode
yjson_decode
: Convertir datos a JSON y viceversa. Necesidad: Interactuar con APIs externas.array_map
: Aplicar funciones a cada elemento de un arreglo. Necesidad: Transformar datos en grandes listas de registros.array_filter
: Filtrar elementos de un arreglo según una condición. Necesidad: Buscar registros específicos en resultados ya cargados.in_array
: Verificar si un valor está en un arreglo. Necesidad: Validar permisos de usuario.
16-20: Mejorando las vistas
number_format
: Formatear números con decimales y separadores. Necesidad: Mostrar precios de manera consistente.date
ystrtotime
: Manejar y formatear fechas. Necesidad: Mostrar fechas amigables y calcular intervalos.nl2br
: Convertir saltos de línea en etiquetas<br>
. Necesidad: Mostrar textos largos en vistas.sprintf
: Formatear cadenas con valores dinámicos. Necesidad: Crear mensajes personalizados en notificaciones.ucfirst
: Convertir la primera letra de una cadena en mayúscula. Necesidad: Mejorar la presentación de nombres propios.
21-25: Seguridad y rendimiento
session_start
y$_SESSION
: Manejar sesiones de usuario. Necesidad: Implementar autenticación de usuarios.uniqid
: Generar identificadores únicos. Necesidad: Crear tokens para restablecer contraseñas.hash
: Crear hashes de datos sensibles. Necesidad: Verificar integridad de información.ob_start
yob_get_clean
: Habilitar el almacenamiento en búfer de salida. Necesidad: Generar contenido dinámico sin enviar datos inmediatamente al navegador.error_log
: Registrar errores personalizados en un archivo de log. Necesidad: Detectar y solucionar problemas en producción.
TechFlow logró satisfacer sus nuevas demandas y mejorar la seguridad, eficiencia y escalabilidad de su sistema MVC.
Además, pudieron ofrecer una mejor experiencia a sus clientes, ayudando a que su software se convirtiera en un referente en el mercado. 🚀
Puedes documentar tus investigaciones, futuras mejoras, o implementaciones que no hayas podido completar por algún tipo de error, pero al menos que se demuestre tu trabajo.
Ánimo!
Algunas funciones útiles desarrolladas.
<?php
class Utilidades
{
private $pdo;
// Constructor para inicializar PDO
public function __construct($pdo)
{
$this->pdo = $pdo;
}
// 1. Prepare y bindParam para consultas seguras
public function ejecutarConsulta($sql, $parametros = [])
{
$stmt = $this->pdo->prepare($sql);
foreach ($parametros as $key => &$value) {
$stmt->bindParam($key, $value);
}
$stmt->execute();
return $stmt;
}
// 2-3. Transacciones: beginTransaction, commit y rollBack
public function manejarTransaccion($acciones)
{
try {
$this->pdo->beginTransaction();
$acciones($this->pdo); // Función callback con acciones a realizar
$this->pdo->commit();
} catch (Exception $e) {
$this->pdo->rollBack();
throw $e;
}
}
// 4. Obtener el último ID insertado
public function obtenerUltimoId()
{
return $this->pdo->lastInsertId();
}
// 5. Recuperar múltiples filas
public function obtenerRegistros($sql, $parametros = [])
{
$stmt = $this->ejecutarConsulta($sql, $parametros);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// 6. Validar entradas
public function validarEmail($email)
{
return filter_var($email, FILTER_VALIDATE_EMAIL);
}
// 7. Escapar caracteres especiales
public function escaparHTML($cadena)
{
return htmlspecialchars($cadena, ENT_QUOTES, 'UTF-8');
}
// 8. Manejar contraseñas de forma segura
public function generarHash($password)
{
return password_hash($password, PASSWORD_DEFAULT);
}
public function verificarPassword($password, $hash)
{
return password_verify($password, $hash);
}
// 9-10. Validar números
public function esNumeroEntero($valor)
{
return ctype_digit($valor);
}
public function esNumero($valor)
{
return is_numeric($valor);
}
// 11-12. Manejo de archivos y JSON
public function guardarArchivo($ruta, $contenido)
{
return file_put_contents($ruta, $contenido);
}
public function leerArchivo($ruta)
{
return file_get_contents($ruta);
}
public function convertirJson($data)
{
return json_encode($data);
}
public function parsearJson($json)
{
return json_decode($json, true);
}
// 13-14. Operaciones con arreglos
public function aplicarFuncionArreglo($arreglo, $funcion)
{
return array_map($funcion, $arreglo);
}
public function filtrarArreglo($arreglo, $funcion)
{
return array_filter($arreglo, $funcion);
}
// 15. Verificar valores en arreglos
public function valorEnArreglo($valor, $arreglo)
{
return in_array($valor, $arreglo);
}
// 16-18. Mejoras en vistas
public function formatearNumero($numero)
{
return number_format($numero, 2, '.', ',');
}
public function convertirFecha($fecha)
{
return date('d-m-Y', strtotime($fecha));
}
public function agregarSaltosLinea($texto)
{
return nl2br($texto);
}
// 19-20. Formateo de cadenas
public function formatearCadena($formato, ...$valores)
{
return sprintf($formato, ...$valores);
}
public function capitalizarPrimeraLetra($cadena)
{
return ucfirst($cadena);
}
// 21-23. Seguridad
public function iniciarSesion()
{
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
}
public function generarIdUnico($prefijo = "")
{
return uniqid($prefijo, true);
}
public function generarHashSimple($data)
{
return hash('sha256', $data);
}
// 24. Manejo de buffer
public function usarBuffer($callback)
{
ob_start();
$callback();
return ob_get_clean();
}
// 25. Log de errores
public function registrarError($mensaje, $archivo = 'error_log.txt')
{
error_log($mensaje . "\n", 3, $archivo);
}
}
// Ejemplo de uso
try {
$pdo = new PDO('mysql:host=localhost;dbname=mi_base_datos', 'usuario', 'contraseña');
$utilidades = new Utilidades($pdo);
// Registrar un usuario
$sql = "INSERT INTO usuarios (nombre, email) VALUES (:nombre, :email)";
$utilidades->ejecutarConsulta($sql, [
':nombre' => 'Juan Pérez',
':email' => 'juan@example.com'
]);
echo "Usuario registrado con ID: " . $utilidades->obtenerUltimoId();
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
}
Ventajas & utilidad
Estas funciones siempren serán útiles para...
- Reutilizabilidad : Cada función puede ser usada en cualquier parte del proyecto.
- Seguridad : Incluye sanitización de entradas, manejo seguro de contraseñas y validaciones.
- Flexibilidad : Las operaciones comunes están abstraídas, facilitando su integración en el patrón MVC.
Con este conjunto de herramientas, puedes ampliar tu proyecto manteniendo la simplicidad y seguridad.
Referencias y más información:
-
https://victorroblesweb.es/2014/07/15/ejemplo-php-poo-mvc/
-
https://dcreations.es/cursos/curso-patrones-de-disenio-en-php-gratis/patron-mvc-en-php
- https://thebigwebdeveloper.blogspot.com/2018/07/curso-de-php-mvc-como-conectar-php-con-bases-de-datos-pdo.html
- https://mcazorla.gitbooks.io/programacion-en-el-servidor/content/conceptos_avanzados_de_acceso_a_bases_de_datos_con_mysql/pdo_php_data_objects.html
- https://mcazorla.gitbooks.io/programacion-en-el-servidor/content/patrones_de_diseno_en_php_ii__patron_mvc/ejemplo_de_como_crear_un_sistema_mvc_paso_a_paso_1.html
- https://www.w3schools.com/php/php_mysql_connect.asp