📖 Referencia Rápida

Cheat sheet para las tareas más comunes en LC-ADVANCE.


🚀 Iniciar Proyecto

# 1. Clonar
git clone https://github.com/cervanlfc7/LC-ADVANCE.git
cd LC-ADVANCE
# 2. Importar BD
mysql -u root -p < db/lc_advance.sql
# 3. Configurar credenciales
# Edita config/config.php
# 4. Iniciar servidor
php -S localhost:8000 -t .
# 5. Abrir navegador
# http://localhost:8000/index.php

📚 Agregar Lección

Archivo: src/content.php

$lecciones[] = [
    'materia'   => 'Inglés',              // ← Nombre de materia
    'slug'      => 'my-first-lesson',     // ← ID único (sin espacios)
    'titulo'    => 'My First Lesson',     // ← Título visible
    'icon'      => '📖',                  // ← Emoji
    'contenido' => <<<'EOT'
<h2>Contenido aquí</h2>
<p>Usa HTML normal</p>
EOT,
    'quiz'      => [
        [
            'pregunta'  => '¿Pregunta 1?',
            'correcta'  => 'Respuesta correcta',
            'opciones'  => ['Respuesta correcta', 'Incorrecto', 'También incorrecto']
        ],
        // Máx 10 preguntas
    ]
];

Importante:

  • slug → único, sin espacios, minúsculas
  • Escapar <?php&lt;?php
  • Usar <<<'EOT' ... EOT; para HTML

🔑 Login de Usuario

curl -X POST http://localhost:8000/login.php \
  -d "nombre_usuario=test&contrasena=Test1234"

🧠 Tomar un Quiz

# 1. Cargar página de lección
curl "http://localhost:8000/leccion_detalle.php?slug=b1-past-simple-2025&materia=Inglés"
# 2. Enviar respuestas
curl -X POST http://localhost:8000/src/funciones.php \
  -d "accion=calificar_quiz&slug=b1-past-simple-2025&q0=option1&q1=option2..."

📊 Endpoint de Estado (con TOP 10)

# Obtener puntos, nivel, badges y ranking del usuario
curl -X POST http://localhost:8000/src/funciones.php \
  -d "accion=obtener_estado"

Respuesta:

{
  "ok": true,
  "puntos": 580,
  "nivel": 2,
  "progreso": 30,
  "badges": [{ "nombre": "Nivel 1: Novato", "tipo": "bronze" }],
  "ranking": [
    { "nombre_usuario": "Admin", "puntos": 5000, "es_actual": false },
    { "nombre_usuario": "Estudiante1", "puntos": 580, "es_actual": true }
  ]
}

🧪 Ejecutar Tests

# Todos
php tests/run_all_tests.php
# Específico
php tests/test_lessons.php
php tests/test_integration.php
php tests/test_e2e_simple.php

🔍 Verificar BD

-- Ver usuarios
mysql> USE lc_advance;
mysql> SELECT id, nombre_usuario, puntos, nivel FROM usuarios;
-- Ver progreso de un usuario
mysql> SELECT u.nombre_usuario, up.slug, up.score, up.completed
       FROM user_progress up
       JOIN usuarios u ON u.id = up.user_id
       WHERE u.nombre_usuario = 'test';
-- Ranking
mysql> SELECT nombre_usuario, puntos FROM usuarios ORDER BY puntos DESC LIMIT 10;

🐛 Verificar Sintaxis PHP

# Verifica que no hay errores de parsing
php -l src/content.php
php -l src/funciones.php
php -l leccion_detalle.php

📁 Estructura Clave

config/config.php       ← BD credentials + session
src/content.php         ← Todas las lecciones ($lecciones)
src/funciones.php       ← AJAX endpoints (calificar_quiz, etc.)
leccion_detalle.php     ← Vista de lección + quiz
dashboard.php           ← Panel del usuario
assets/js/app.js        ← Lógica cliente (listeners)
assets/css/style.css    ← Estilos
db/lc_advance.sql       ← BD dump (importar aquí)

🌐 URLs Principales

URLDescripción
/index.phpLanding page
/login.phpLogin
/register.phpRegistro
/dashboard.phpPanel usuario (requiere login)
/leccion_detalle.php?slug=X&materia=YLección + quiz
/mapa/index.htmlMapa interactivo
/src/funciones.phpEndpoints AJAX

⚙️ Configuración

Archivo: config/config.php

define('DB_HOST', 'localhost');     // Host MySQL
define('DB_NAME', 'lc_advance');    // Nombre BD
define('DB_USER', 'root');          // Usuario MySQL
define('DB_PASS', '');              // Contraseña

Variables de entorno (override):

export DB_HOST=prod-server.com
export DB_NAME=lc_prod
export DB_USER=lcuser
export DB_PASS=securepass123

🔐 Seguridad

  • ✅ Contraseñas: passwordhash() + passwordverify()
  • ✅ SQL Injection: Prepared statements con PDO
  • ✅ CSRF: Token en formularios (config/csrf.php)
  • ✅ HTML Escaping: htmlspecialchars()
  • ✅ Sesiones: $SESSION['usuarioid']

📝 Estructura de Lección

$lecciones[] = [
    'materia'   => 'string',        // Nombre de materia
    'slug'      => 'string',        // ID único
    'titulo'    => 'string',        // Título visible
    'icon'      => 'string|emoji',  // Icono
    'contenido' => 'string (HTML)', // Contenido
    'quiz'      => [                // Array de preguntas
        [
            'pregunta'  => 'string',
            'correcta'  => 'string', // (debe coincidir con una opción)
            'opciones'  => ['string', ...]
        ]
    ]
];

📤 Enviar Respuestas de Quiz

Request:

POST /src/funciones.php
accion=calificar_quiz
slug=b1-past-simple-2025
q0=opcion1
q1=opcion2
q2=opcion3
...

Response:

{
  "ok": true,
  "score": 8,
  "xp_ganado": 80,
  "new_puntos": 580,
  "new_nivel": 2,
  "details": [
    {
      "pregunta": "...",
      "correcta": "...",
      "respuesta": "...",
      "acertada": true
    }
  ]
}

🎯 Flujos Principales

1. Usuario Nuevo → Quiz → Puntos

Register → Login → Dashboard
  → Selecciona Lección
  → Lee Contenido
  → Responde Quiz
  → Recibe Puntos
  → Aparece en Ranking

2. Acceso Invitado

"Entrar como invitado"
  → Lee lecciones
  → Puede responder quiz (sin guardar)
  → Logout automático al cerrar

3. Admin (futuro)

/admin/dashboard.php
  → Ver analytics
  → Agregar lecciones
  → Ver reporte de usuarios

🚨 Errores Comunes

ErrorSolución
"Table not found"mysql -u root -p < db/lc_advance.sql
"Access denied"Verifica DBUSER/DBPASS en config/config.php
"Parse error in src/content.php"Busca <?php sin escapar o <<<EOT sin cerrar
"Login no funciona"Verifica sesión y tabla usuarios
"Puntos no se guardan"Verifica user_progress table y conexión PDO

💡 Tips

  1. Recarga sin caché: Ctrl+Shift+R
  2. Ver logs PHP: tail -f /var/log/php_error.log
  3. Debug SQL: Agrega echo $sql; antes de execute()
  4. Test endpoint: Usa curl para verificar que responde
  5. Verificar permisos: chmod 755 /var/www/html/LC-ADVANCE

🔗 Enlaces Útiles


Última actualización: Enero 2026