🎯 Objetivo del tema
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.
El modelo de tablas, filas, columnas y relaciones.
Los 4 verbos: SELECT, INSERT, UPDATE, DELETE.
Cómo crear bases de datos, tablas, y usuarios sin tocar la consola.
Las dos APIs de PHP para hablar con MySQL. Cuál usar y por qué.
Subir archivos, crear base de datos, configurar dominio.
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.
| Concepto | Qué es | Ejemplo en una tabla 'usuarios' |
|---|---|---|
| Tabla | Una '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. |
| Índice | Estructura que acelera las búsquedas. | INDEX(email) para buscar por email rápido. |
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
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.
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.
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
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ón | Para qué sirve | Lo que harás en el curso |
|---|---|---|
| File Manager | Subir/editar archivos del sitio. | Subir tu proyecto PHP. |
| MySQL Databases | Crear bases de datos y usuarios. | Crear la BD de tu proyecto. |
| phpMyAdmin | Administrar BD visualmente. | Crear tablas, insertar datos. |
| Email Accounts | Crear emails con tu dominio. | Configurar email de contacto. |
| Domains | Administrar dominios y subdominios. | Apuntar tu dominio al hosting. |
| SSL/TLS Status | Activar HTTPS. | Certificado gratis con Let's Encrypt. |
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
| Error | Causa típica | Solución |
|---|---|---|
| No carga la página | Archivos 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 BD | Credenciales incorrectas. | Verifica host, user, pass, dbname en conexion.php. |
| CSS no se ve | Rutas absolutas en lugar de relativas. | Usa href='css/estilos.css' (sin / al inicio). |
| Tildes y eñes raros | Charset incorrecto. | Asegúrate de usar utf8mb4 en BD y <meta charset='utf-8'>. |
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
- Diseña las tablas: libros, autores, categorias, prestamos, usuarios.
- Define las relaciones: prestamos tiene FK a usuarios y libros.
- Crea el script SQL: CREATE TABLE para cada tabla con tipos correctos.
- Inserta datos de prueba: 5 libros, 3 autores, 2 categorías, 3 usuarios.
- Escribe las consultas: SELECT para listar libros disponibles, INSERT para un préstamo, UPDATE para devolver.
- Ejecuta en phpMyAdmin o línea de comandos.
- 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É.'
- Aplica las 2 mejoras. Vuelve a probar las consultas.
- 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
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.
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.
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.
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.).
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
- Abre phpMyAdmin (en XAMPP o tu hosting).
- Crea la base de datos 'biblioteca' con cotejamiento utf8mb4_unicode_ci.
- Diseña las tablas: libros, autores, categorias, prestamos, usuarios.
- Define las relaciones: prestamos.usuario_id -> usuarios.id; prestamos.libro_id -> libros.id; libros.autor_id -> autores.id; libros.categoria_id -> categorias.id.
- Crea cada tabla con sus columnas, tipos, PK, FK, NOT NULL, e índices.
- Inserta datos de prueba (5 libros, 3 autores, 2 categorías, 3 usuarios, 2 préstamos activos).
- Escribe y prueba las consultas: listar libros disponibles, libros por autor, préstamos activos de un usuario, registrar préstamo, devolver libro.
- Exporta la BD completa como biblioteca.sql.
- Sube el .sql a tu repo en GitHub (NO el .sql con datos sensibles, solo la estructura).
- 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.