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

1

Usuario completa formulario

El usuario ingresa nombre, apellido y observaciones del día

2

PHP procesa los datos

El servidor sanitiza los datos y determina el próximo número de día

3

Se crea el archivo

Se genera un nuevo archivo PHP con la entrada del diario

4

Redirección al menú

El usuario es redirigido al menú principal donde puede ver todas sus entradas