Sistema de Diario Personal con PHP
Aprende a crear un diario personal dinámico con manipulación de archivos PHP
Descargar Código Ejemplo 1 Descargar Código Ejemplo 2 Ver ejercicio de entrega¿Qué es un Sistema de Diario Personal?
Crear Entradas
Genera nuevas entradas de diario automáticamente
Guardar en Archivos
Cada entrada se almacena en un archivo PHP independiente
Gestión de Entradas
Visualiza y organiza todas tus entradas desde un menú central
Numeración Automática
El sistema numera los días consecutivamente
Arquitectura del Sistema
📄 diario.php
Página principal con formulario y listado de entradas
📝 registro.php
Procesa el formulario y crea nuevas entradas
📚 menu.php
Menú de navegación entre todas las entradas
📁 registros/
Directorio donde se almacenan todas las entradas
Estado Actual de la Entrada de Demo
Archivo: diario_demo.php EXISTE
Tamaño: 1114 bytes
Última modificación: 2026-09-10 16:12:04
Contenido actual:
<?php include_once '../database/config.php'; ?>
<?php
// Mi Diario Personal - Entrada de ejemplo
$fecha = date('Y-m-d H:i:s');
$nombre = 'Usuario Demo';
?>
<html>
<head>
<!-- FOUC-FIX-DARKTHEME: evita el flash de modo claro al cargar/navegar con el modo oscuro activado -->
<style>html.dark-theme,html.dark-theme body{background-color:#121212 !important;color-scheme:dark}</style>
<script>(function(){try{var t=localStorage.getItem('theme');if(t==='dark'||(t===null&&window.matchMedia('(prefers-color-scheme: dark)').matches)){var h=document.documentElement;h.classList.add('dark-theme');h.style.colorScheme='dark';}}catch(e){}})();</script>
<title><?php echo t('Mi Diario'); ?></title>
</head>
<body>
<h1><?php echo t('Mi Diario Personal'); ?></h1>
<p><strong><?php echo t('Fecha'); ?>:</strong> <?php echo $fecha; ?></p>
<p><strong><?php echo t('Nombre'); ?>:</strong> <?php echo $nombre; ?></p>
<div>
<h2><?php echo t('Mis pensamientos de hoy:'); ?></h2>
<p><?php echo t('Esta es una entrada de ejemplo en mi diario personal.'); ?></p>
</div>
</body>
</html>
Prueba el Sistema de Diario
Usa los siguientes controles para probar las funciones del diario personal en tiempo real:
Panel de Control del Diario
Código del Sistema Explicado
Función para Crear Entradas
<?php
function crearArchivoDia($numero_dia, $nombre, $apellido, $observaciones, $fecha) {
$contenido_archivo = '<html>
<head>
<title>Día '.$numero_dia.'</title>
<link rel="stylesheet" href="../template/css/default.css">
</head>
<body>
<div class="contenedor-pagina">
<div class="encabezado-pagina">
<h1>📅 Día '.$numero_dia.'</h1>
<a href="../menu.php" class="boton-volver">← Volver al Menú</a>
</div>
<div class="tarjeta-entrada">
<div class="info-entrada">
<p><strong>Fecha:</strong> '.$fecha.'</p>
<p><strong>Nombre:</strong> '.$nombre.' '.$apellido.'</p>
</div>
<div class="seccion-observaciones">
<h3>📝 Lo que hice hoy:</h3>
<div class="contenido-observaciones">
'.nl2br($observaciones).'
</div>
</div>
</div>
</div>
</body>
</html>';
$nombre_archivo = "registros/Dia $numero_dia.php";
file_put_contents($nombre_archivo, $contenido_archivo);
}
?>
Función clave: file_put_contents() crea el archivo automáticamente si no existe
nl2br(): Convierte saltos de línea en etiquetas <br> para HTML
Estructura HTML: Se genera una página HTML completa para cada entrada
Procesamiento del Formulario
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Sanitizar entradas $nombre = htmlspecialchars($_POST['nombre']);
$apellido = htmlspecialchars($_POST['apellido']);
$observaciones = htmlspecialchars($_POST['observaciones']);
$fecha = date('Y-m-d H:i:s');
// Obtener próximo número de día $numero_dia = obtenerProximoDia();
// Crear archivo crearArchivoDia($numero_dia, $nombre, $apellido, $observaciones, $fecha);
// Redirigir al menú header("Location: menu.php?creado=$numero_dia");
exit();
}
?>
htmlspecialchars(): Previene ataques XSS escapando caracteres especiales
header(): Redirige al usuario después de procesar el formulario
date(): Obtiene la fecha y hora actual del servidor
Función para Listar Entradas
<?php
function obtenerDiasRegistrados() {
$carpeta_registros = "registros";
if (!file_exists($carpeta_registros)) {
mkdir($carpeta_registros, 0777, true);
}
$archivos = glob("$carpeta_registros/Dia *.php");
$dias = [];
foreach ($archivos as $archivo) {
preg_match('/Dia (\d+)\.php/', $archivo, $coincidencia);
if (isset($coincidencia[1])) {
$dias[] = $coincidencia[1];
}
}
rsort($dias);
return $dias;
}
?>
glob(): Busca archivos que coincidan con el patrón "Dia *.php"
preg_match(): Extrae el número del día del nombre del archivo
rsort(): Ordena los días de mayor a menor
mkdir(): Crea el directorio si no existe
Ejercicios para Practicar
Ejercicio 1: Añadir Categorías
Modifica el sistema para que cada entrada pueda tener una categoría (Trabajo, Personal, Estudio, etc.)
Solución sugerida:
// Añadir campo categoría al formulario<select name="categoria">
<option value="personal">Personal</option>
<option value="trabajo">Trabajo</option>
<option value="estudio">Estudio</option>
</select>
// En crearArchivoDia(), incluir la categoría$contenido_archivo = '...<p><strong>Categoría:</strong> '.$categoria.'...';
// Mostrar la categoría en la visualización
Ejercicio 2: Búsqueda de Entradas
Implementa un sistema de búsqueda que permita encontrar entradas por palabras clave
Solución sugerida:
function buscarEnEntradas($termino) {
$entradas = obtenerDiasRegistrados();
$resultados = [];
foreach ($entradas as $dia) {
$contenido = file_get_contents("registros/Dia $dia.php");
if (stripos($contenido, $termino) !== false) {
$resultados[] = $dia;
}
}
return $resultados;
}
// En el formulario de búsqueda<form method="GET" action="buscar.php">
<input type="text" name="q" placeholder="Buscar en entradas...">
<button type="submit">Buscar</button>
</form>
Ejercicio 3: Backup Automático
Crea una función para hacer backup de todas las entradas en un archivo ZIP
Solución sugerida:
function crearBackupDiario() {
$zip = new ZipArchive();
$backup_file = 'backup_diario_' . date('Y-m-d') . '.zip';
if ($zip->open($backup_file, ZipArchive::CREATE) === TRUE) {
$entradas = glob("registros/*.php");
foreach ($entradas as $entrada) {
$zip->addFile($entrada, basename($entrada));
}
$zip->close();
return $backup_file;
}
return false;
}
// Descargar el backupheader('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="'.$backup_file.'"');
readfile($backup_file);
Flujo de Trabajo Completo
Usuario completa formulario
El usuario ingresa nombre, apellido y observaciones del día
PHP procesa los datos
El servidor sanitiza los datos y determina el próximo número de día
Se crea el archivo
Se genera un nuevo archivo PHP con la entrada del diario
Redirección al menú
El usuario es redirigido al menú principal donde puede ver todas sus entradas