🗄️ 2.4 · MySQL y CPANEL: bases de datos y hosting

⏱ 6h 00min ⚡ 100 XP 🏅 Practicante 📖 Backend FullStack
"Sin base de datos, cada reset del servidor borra todo. Con base de datos, tu app tiene memoria."

🎯 Objetivo del tema

Al terminar este tema serás capaz de: Al terminar este tema serás capaz de diseñar bases de datos relacionales con MySQL, escribir consultas SQL (SELECT, INSERT, UPDATE, DELETE), usar phpMyAdmin para administrarlas visualmente, y subir tu proyecto a un hosting compartido con CPANEL. Tus formularios del Tema 2.3 finalmente GUARDARÁN datos en una base real.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

🗺️ Mapa del tema

Hasta ahora, los datos que 'guardabas' en tus scripts PHP se perdían al recargar la página. Hoy aprenderás a persistir datos en una base de datos MySQL, el motor más usado del mundo. Y no solo en tu localhost: aprenderás a subir tu proyecto a un hosting compartido con CPANEL (el mismo que usarás en tu vida profesional), para que tu sitio sea accesible desde internet.

1. Bases de datos relacionales: qué son y por qué

El modelo de tablas, filas, columnas y relaciones.

2. SQL: el lenguaje de las bases de datos

Los 4 verbos: SELECT, INSERT, UPDATE, DELETE.

3. phpMyAdmin: administración visual

Cómo crear bases de datos, tablas, y usuarios sin tocar la consola.

4. Conectar PHP con MySQL: PDO y MySQLi

Las dos APIs de PHP para hablar con MySQL. Cuál usar y por qué.

5. CPANEL: tu hosting compartido

Subir archivos, crear base de datos, configurar dominio.

6. Deploy: de localhost a internet

El proceso completo: de tu PC al mundo.

2.4.1 Bases de datos relacionales: qué son y por qué

Una base de datos relacional organiza los datos en TABLAS (como hojas de cálculo) con columnas (campos) y filas (registros). Las tablas se relacionan entre sí mediante claves (IDs). Es el modelo más usado del mundo: MySQL, PostgreSQL, SQL Server, Oracle, SQLite. Es la base de casi todo en la web.

📷 Imagen referencial: Diagrama de una base de datos relacional: 4 tablas conectadas por claves foráneas (FK).
ConceptoQué esEjemplo en una tabla 'usuarios'
TablaUna 'hoja' con datos de un tipo de entidad.usuarios, posts, comentarios.
Fila (registro)Un dato individual de la tabla.Un usuario específico: Ana, 25, ana@mail.com.
Columna (campo)Una propiedad de la entidad.nombre, edad, email.
Clave primaria (PK)Columna que identifica CADA fila de forma única.id (autoincrement).
Clave foránea (FK)Columna que apunta a la PK de otra tabla, creando la relación.posts.usuario_id -> usuarios.id.
ÍndiceEstructura que acelera las búsquedas.INDEX(email) para buscar por email rápido.
⭐ Tabla = un tipo de objeto: La regla de oro: una fila = un objeto del mundo real (un usuario, un post, un pedido). Una columna = una propiedad de ese objeto. Una tabla = una colección del mismo tipo de objetos. Si tu tabla tiene datos de objetos DIFERENTES (usuarios mezclados con pedidos), está mal diseñada.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

2.4.2 SQL: el lenguaje de las bases de datos

SQL (Structured Query Language) es el lenguaje estándar para hablar con bases de datos relacionales. Tiene 4 verbos principales: SELECT (leer), INSERT (crear), UPDATE (actualizar), DELETE (eliminar). Si dominas estos 4, puedes hacer el 90% de lo que cualquier app web necesita.

-- CREAR una tabla (esto es DDL, no DML, pero va aquí)
CREATE TABLE usuarios (
  id INT AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(100) NOT NULL,
  email VARCHAR(150) UNIQUE NOT NULL,
  edad INT CHECK (edad >= 0),
  activo BOOLEAN DEFAULT TRUE,
  creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- INSERT: crear un nuevo registro
INSERT INTO usuarios (nombre, email, edad) VALUES
  ('Ana López', 'ana@mail.com', 25),
  ('Luis Pérez', 'luis@mail.com', 30);

-- SELECT: leer registros
SELECT * FROM usuarios;                          -- todos
SELECT nombre, email FROM usuarios WHERE activo = TRUE;  -- filtrar
SELECT * FROM usuarios WHERE email LIKE '%@gmail.com';  -- patrón
SELECT * FROM usuarios ORDER BY edad DESC LIMIT 10;     -- ordenar y limitar

-- UPDATE: actualizar un registro
UPDATE usuarios SET edad = 26 WHERE email = 'ana@mail.com';

-- DELETE: eliminar registros (¡CUIDADO!)
DELETE FROM usuarios WHERE activo = FALSE;

Los 4 verbos SQL: SELECT, INSERT, UPDATE, DELETE

⭐ DELETE sin WHERE = desastre: DELETE sin WHERE borra TODA la tabla. Es uno de los errores más catastróficos en bases de datos. SIEMPRE usa WHERE. Y antes de hacer DELETE o UPDATE en producción, haz un SELECT con el mismo WHERE para verificar QUÉ se va a afectar.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

2.4.3 phpMyAdmin: administración visual

phpMyAdmin es la interfaz web estándar para administrar MySQL. Viene preinstalada en XAMPP, CPANEL, y casi todos los hostings. Te permite crear bases de datos, tablas, usuarios, ejecutar consultas SQL, y ver/editar datos visualmente, SIN tocar la consola.

📷 Imagen referencial: Captura de phpMyAdmin: panel lateral con bases de datos, panel principal con estructura de tabla, pestaña SQL para consultas.

Las 5 operaciones más comunes en phpMyAdmin

  • Crear base de datos: panel izquierdo > 'Nueva' > nombre > cotejamiento utf8mb4_unicode_ci > Crear.
  • Crear tabla: seleccionar BD > pestaña 'Estructura' > nombre + número de columnas > agregar columnas (nombre, tipo, longitud, NULL, default).
  • Insertar datos: tabla > pestaña 'Insertar' > llenar valores > Continuar.
  • Ver/editar datos: tabla > pestaña 'Examinar' > clic en el campo para editarlo.
  • Ejecutar SQL: tabla > pestaña 'SQL' > escribir consulta > Continuar.
⭐ utf8mb4 SIEMPRE: Usa SIEMPRE cotejamiento utf8mb4_unicode_ci al crear la base de datos. Si usas latin1 (el default antiguo), las tildes, eñes y emojis se guardan mal. utf8mb4 es el estándar moderno y soporta todos los caracteres Unicode.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

2.4.4 Conectar PHP con MySQL: PDO

PHP tiene 2 APIs para hablar con MySQL: MySQLi (nativa, solo MySQL) y PDO (PHP Data Objects, soporta múltiples motores). La recomendación moderna es PDO: es más segura (prepared statements nativos), portable, y más limpia.

<?php
// conexion.php: la conexión a la base de datos
$host = 'localhost';
$dbname = 'mi_app';
$user = 'root';
$pass = '';  // en local vacío, en producción NUNCA vacío
$charset = 'utf8mb4';

// DSN = Data Source Name
$dsn = "mysql:host=$host;dbname=$dbname;charset=$charset";

// Opciones de PDO: errores como excepciones, fetch como assoc
$options = [
  PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,  // lanzar excepciones
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,  // arrays asociativos
  PDO::ATTR_EMULATE_PREPARES => false,  // prepared statements reales
];

try {
  $pdo = new PDO($dsn, $user, $pass, $options);
  echo 'Conexión exitosa';
} catch (PDOException $e) {
  // En producción, NO muestres el error al usuario (información sensible)
  error_log($e->getMessage());
  echo 'Error de conexión. Intenta más tarde.';
}

Conexión PDO a MySQL con manejo de errores

⭐ Las 3 opciones de PDO: Las 3 opciones de PDO son FUNDAMENTALES: (1) ERRMODE_EXCEPTION: los errores lanzan excepciones, no warnings silenciosos. (2) FETCH_ASSOC: los resultados vienen como array asociativo (más limpio). (3) EMULATE_PREPARES = false: usa prepared statements REALES, no emulados. Sin esto, los prepared statements no te protegen de SQL injection.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

2.4.5 CPANEL: tu hosting compartido

CPANEL es el panel de control estándar de los hostings compartidos (Hostinger, Bluehost, SiteGround, etc.). Te permite administrar tu hosting sin ser experto en servidores: archivos, bases de datos, emails, dominios, SSL. En este curso IPN es probable que uses hosting con CPANEL para tu proyecto final.

Las 6 secciones de CPANEL que necesitas

SecciónPara qué sirveLo que harás en el curso
File ManagerSubir/editar archivos del sitio.Subir tu proyecto PHP.
MySQL DatabasesCrear bases de datos y usuarios.Crear la BD de tu proyecto.
phpMyAdminAdministrar BD visualmente.Crear tablas, insertar datos.
Email AccountsCrear emails con tu dominio.Configurar email de contacto.
DomainsAdministrar dominios y subdominios.Apuntar tu dominio al hosting.
SSL/TLS StatusActivar HTTPS.Certificado gratis con Let's Encrypt.
⭐ File Manager > FileZilla: NUNCA subas archivos con FileZilla a un hosting con CPANEL. Usa el File Manager de CPANEL, que respeta los permisos de archivos correctos. FileZilla a veces deja archivos con permisos 777 (lectura/escritura para todos), un riesgo de seguridad. CPANEL los deja correctos.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

2.4.6 Deploy: de localhost a internet

El deploy (despliegue) es subir tu proyecto de tu computadora a un servidor accesible desde internet. Es el momento de la verdad: tu código deja de ser 'solo en mi PC' y se convierte en 'vivo en la web'. Vamos a ver el proceso paso a paso.

El proceso completo de deploy

  • 1. Contrata hosting con CPANEL (Hostinger, SiteGround, etc.) o usa XAMPP en tu propia PC.
  • 2. Sube los archivos con File Manager: index.php, css/, js/, img/, etc. a public_html/.
  • 3. Crea la base de datos: CPANEL > MySQL Databases > nueva BD + usuario.
  • 4. Importa la estructura: phpMyAdmin > selecciona BD > pestaña Importar > tu archivo .sql.
  • 5. Actualiza la conexión: en conexion.php, cambia el host, user, pass, dbname por los del hosting.
  • 6. Configura HTTPS: CPANEL > SSL/TLS Status > instalar Let's Encrypt (gratis).
  • 7. Prueba: abre tu dominio en el navegador. ¿Funciona?

Errores comunes en el primer deploy

ErrorCausa típicaSolución
No carga la páginaArchivos en carpeta equivocada.Verifica que estén en public_html/.
Error 'could not find driver'PHP sin extensión PDO_MySQL.Contacta al hosting o usa MySQLi.
Error de conexión a BDCredenciales incorrectas.Verifica host, user, pass, dbname en conexion.php.
CSS no se veRutas absolutas en lugar de relativas.Usa href='css/estilos.css' (sin / al inicio).
Tildes y eñes rarosCharset incorrecto.Asegúrate de usar utf8mb4 en BD y <meta charset='utf-8'>.
⭐ El primer deploy siempre tiene errores: El primer deploy SIEMPRE tiene errores. No te frustres: es normal. La clave es tener un checklist: archivos subidos, BD creada, conexion.php actualizado, HTTPS activo. Si algo falla, abre DevTools > Console y los logs de error de CPANEL (Error Log en la sección Metrics).
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

📚 Contenido ampliado

Material adicional, referencias externas verificadas y ejemplos extendidos.

🤖 AI Mission

Las bases de datos se diseñan pensando en el futuro, no solo en el presente.

Misión: Diseña la base de datos para una 'biblioteca de libros': tablas para libros, autores, categorías, préstamos. Escribe las consultas SQL más importantes: listar libros disponibles, registrar un préstamo, devolver un libro. Pídele a la IA que revise tu diseño y te sugiera 2 mejoras (índices, relaciones, normalización). Anota en tu cuaderno: ¿qué aprendiste sobre diseño de bases de datos que no habías considerado?

Pasos sugeridos

  1. Diseña las tablas: libros, autores, categorias, prestamos, usuarios.
  2. Define las relaciones: prestamos tiene FK a usuarios y libros.
  3. Crea el script SQL: CREATE TABLE para cada tabla con tipos correctos.
  4. Inserta datos de prueba: 5 libros, 3 autores, 2 categorías, 3 usuarios.
  5. Escribe las consultas: SELECT para listar libros disponibles, INSERT para un préstamo, UPDATE para devolver.
  6. Ejecuta en phpMyAdmin o línea de comandos.
  7. Pídele a la IA: 'Tengo este esquema de biblioteca. Sugiere 2 mejoras: índices, normalización, o relaciones. NO me des código, dime QUÉ agregar y POR QUÉ.'
  8. Aplica las 2 mejoras. Vuelve a probar las consultas.
  9. Anota: 3 cosas que aprendiste sobre diseño de bases de datos que no anticipabas.

📓 Entregable: Script SQL completo (CREATE + INSERT + SELECT/INSERT/UPDATE), captura de phpMyAdmin con las tablas y datos, y media página de cuaderno con tu reflexión.

🚫 Errores típicos de razonamiento

Error 1: Usar latin1 en vez de utf8mb4 al crear la base de datos.
Por qué: latin1 es el charset antiguo que no soporta tildes, eñes, ni emojis correctamente. Si tu BD está en latin1, los datos con caracteres especiales se ven como 'ñ' o 'é'. utf8mb4 es el estándar moderno que soporta TODO Unicode. Créala desde el inicio con cotejamiento utf8mb4_unicode_ci.
Error 2: Hacer DELETE sin WHERE y borrar toda la tabla.
Por qué: DELETE FROM usuarios; sin WHERE borra TODOS los registros de la tabla. Es uno de los errores más catastróficos en bases de datos. SIEMPRE usa WHERE. Y antes de DELETE o UPDATE en producción, haz un SELECT con el mismo WHERE para verificar QUÉ se va a afectar. Cuesta 10 segundos y puede salvarte el trabajo de meses.
Error 3: Construir consultas SQL concatenando strings del usuario (SQL injection).
Por qué: Si haces $sql = "SELECT * FROM usuarios WHERE email = '" . $_POST['email'] . "'"; y el usuario escribe ' OR '1'='1, tu query devuelve TODOS los usuarios. Es SQL Injection, uno de los ataques más viejos y peligrosos. Solución: SIEMPRE prepared statements con PDO: $stmt = $pdo->prepare('SELECT * FROM usuarios WHERE email = ?'); $stmt->execute([$_POST['email']]); El '?' es un placeholder que NUNCA se interpreta como código SQL.
Error 4: No crear índices en columnas de búsqueda frecuente.
Por qué: Si tu tabla tiene 100,000 usuarios y haces SELECT * FROM usuarios WHERE email = 'ana@mail.com' SIN índice, MySQL tiene que recorrer TODA la tabla (table scan). Con índice en la columna email, la búsqueda es instantánea. Regla: índice en todas las columnas que uses en WHERE frecuentemente (email, username, FKs, etc.).
Error 5: Olvidar cambiar las credenciales de la BD al subir a producción.
Por qué: Tu conexion.php tiene user 'root' y pass '' para localhost. Si lo subes al hosting SIN cambiar, tu app no funcionará (el hosting tiene otros usuarios) o será un riesgo de seguridad. SIEMPRE actualiza las credenciales: el hosting te da un usuario y password específicos para TU base de datos. Mejor aún: usa variables de entorno (.env) para no tener credenciales en el código.

🧪 Laboratorio práctico

Diseñar bases de datos es el arte de modelar el mundo real en tablas.

Laboratorio: Base de datos de una biblioteca en MySQL

Objetivo: Diseñar e implementar una base de datos completa para una biblioteca: crear las tablas, insertar datos de prueba, escribir las consultas más comunes, y exportarla como archivo .sql. El resultado será la base para el CRUD del Tema 2.5.

Pasos

  1. Abre phpMyAdmin (en XAMPP o tu hosting).
  2. Crea la base de datos 'biblioteca' con cotejamiento utf8mb4_unicode_ci.
  3. Diseña las tablas: libros, autores, categorias, prestamos, usuarios.
  4. Define las relaciones: prestamos.usuario_id -> usuarios.id; prestamos.libro_id -> libros.id; libros.autor_id -> autores.id; libros.categoria_id -> categorias.id.
  5. Crea cada tabla con sus columnas, tipos, PK, FK, NOT NULL, e índices.
  6. Inserta datos de prueba (5 libros, 3 autores, 2 categorías, 3 usuarios, 2 préstamos activos).
  7. Escribe y prueba las consultas: listar libros disponibles, libros por autor, préstamos activos de un usuario, registrar préstamo, devolver libro.
  8. Exporta la BD completa como biblioteca.sql.
  9. Sube el .sql a tu repo en GitHub (NO el .sql con datos sensibles, solo la estructura).
  10. Haz commit: 'feat: schema de base de datos para biblioteca'.

📓 Entregable: Archivo biblioteca.sql con la estructura completa, captura de phpMyAdmin con las 5 tablas y sus relaciones, capturas de las consultas ejecutadas, y commit en Git.

📓 Tu cuaderno: Anota pseudocódigo, diagramas, errores que encontraste y respuestas a "explica sin código". La escritura manual refuerza tu razonamiento. Tu profesor puede pedirte que subas fotos de páginas específicas.