Cómo Usar PHP 8 y MySQL 8 (CRUD)
7 minuto(s)En esta página:
Al menos hasta la fecha de este tutorial, el lenguaje de programación PHP y la base de datos MySQL.
Han recibiendo nuevas características y por ende la forma de trabajar ha cambiado.
La mejor forma de aprender es practicando, por ello en este tutorial te enseñaré a Cómo Usar PHP 8 y MySQL 8 (CRUD), vamos con ello.
1 Verificamos nuestra versión de PHP y MySQL
Antes de continuar verificamos las versiones con los siguientes comandos:
|
1 2 3 4 5 6 7 8 9 10 11 |
# Verificamos la versión de PHP php -v PHP 8.2.12 (cli) (built: Oct 24 2023 21:15:15) (ZTS Visual C++ 2019 x64) Copyright (c) The PHP Group Zend Engine v4.2.12, Copyright (c) Zend Technologies # Verificamos la versión de MySQL mysql --version mysql Ver 15.1 Distrib 10.4.32-MariaDB, for Win64 (AMD64), source revision c4143f909528e3fab0677a28631d10389354c491 |
Ahora pasemos a crear el proyecto.
2. La Base de Datos (MySQL 8)
Mediante la siguiente consulta, creamos una base de datos llamada tienda con tabla sencilla llamada productos, MySQL 8 tiene un mejor manejo de los indices y los caracteres utf8mn4:
|
1 2 3 4 5 6 7 8 9 10 11 |
CREATE DATABASE tienda; USE tienda; CREATE TABLE productos ( id INT AUTO_INCREMENT PRIMARY KEY, nombre VARCHAR(100) NOT NULL, precio DECIMAL(10, 2) NOT NULL, creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; |
Nuestra base de datos y la tabla creada se veria así:

Ahora vayamos con el modelo en PHP.
3. Configuración de Conexión
PHP 8 tiene ciertas reglas de oro modernas como el tipado estricto, clases de solo lectura para transferencia de datos y un manejo de errores impecable.
El uso de PDO (PHP Data Objects) es un estándar en PHP 8, lo usaremos con el modo de error por defecto en EXCEPTION, esto es algo que PHP 8 maneja de forma estricta.
Creamos un archivo llamado db.php para nuestra conexión entre PHP y MySQL y agregamos lo siguiente (He colocado comentarios para explicar que hace cada línea de código):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
<?php // Archivo de configuración para la conexión a la base de datos // Definición de variables de conexión $host = 'localhost'; // El servidor donde reside la base de datos (localmente es localhost) $db = 'tienda'; // El nombre de tu base de datos $user = 'root'; // Usuario por defecto en XAMPP $pass = ''; // Contraseña (por defecto está vacía en XAMPP) $charset = 'utf8mb4'; // Codificación que permite emojis y caracteres especiales (como la ñ) // DSN (Data Source Name) // Es una cadena que contiene la información necesaria para conectarse (tipo de DB, host, nombre y charset) $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; // Opciones de configuración de PDO $options = [ // Lanza una excepción (error) si algo sale mal. ¡Súper útil para desarrollo! PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // Configura el modo de obtención de datos: devuelve un array asociativo (ej: $fila['nombre']) PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // Desactiva la emulación de consultas preparadas para mayor seguridad contra inyección SQL PDO::ATTR_EMULATE_PREPARES => false, ]; // Intento de conexión con Try-Catch try { // Se crea la instancia del objeto PDO para iniciar la conexión $pdo = new PDO($dsn, $user, $pass, $options); } catch (\PDOException $e) { // Si ocurre un error (ej: contraseña mal, BD no existe), entra aquí: // Indicamos al navegador que la respuesta será un JSON con un código de error 500 (Error del servidor) header('Content-Type: application/json', true, 500); // Mostramos el mensaje de error en formato JSON para que una App o Frontend lo entienda echo json_encode(['error' => 'Error de conexión: ' . $e->getMessage()]); // Detenemos la ejecución del script por completo exit; } |
Vayamos con nuestro CRUD.
4. El CRUD (API)
Vamos a crear nuestras tareas CRUD (Create, Read, Update y Delete) en un solo archivo.
No quiero hacer el CRUD muy complejo, para que aprendas poco a poco y no marearte.
Creamos un archivo con el nombre index.php y agregamos lo siguiente (He colocado comentarios en las partes necesarias para explicar que hace ese código):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
<?php // Archivo index.php // Usamos nuestro archivo de conexión a la base de datos require 'db.php'; header('Content-Type: application/json'); $method = $_SERVER['REQUEST_METHOD']; $id = $_GET['id'] ?? null; // Usamos match para una sintaxis limpia y funcional try { $response = match($method) { 'GET' => $id ? getProduct($pdo, (int)$id) : getAllProducts($pdo), 'POST' => createProduct($pdo), 'PUT' => updateProduct($pdo, (int)$id), 'DELETE' => deleteProduct($pdo, (int)$id), default => throw new Exception("Método no permitido", 405) }; echo json_encode($response); } catch (Exception $e) { http_response_code($e->getCode() ?: 400); echo json_encode(['status' => 'error', 'message' => $e->getMessage()]); } /* Tareas CRUD */ // Create (Crear) function createProduct($pdo) { $data = json_decode(file_get_contents("php://input"), true); if (empty($data['nombre']) || empty($data['precio'])) throw new Exception("Datos incompletos"); $stmt = $pdo->prepare("INSERT INTO productos (nombre, precio) VALUES (?, ?)"); $stmt->execute([$data['nombre'], $data['precio']]); return ['id' => $pdo->lastInsertId(), 'status' => 'creado']; } // Read (Leer) function getProduct($pdo, int $id) { $stmt = $pdo->prepare("SELECT * FROM productos WHERE id = ?"); $stmt->execute([$id]); return $stmt->fetch() ?: throw new Exception("Producto no encontrado", 404); } // Update (Actualizar) function updateProduct($pdo, int $id) { $data = json_decode(file_get_contents("php://input"), true); $stmt = $pdo->prepare("UPDATE productos SET nombre = ?, precio = ? WHERE id = ?"); $stmt->execute([$data['nombre'], $data['precio'], $id]); return ['status' => 'actualizado']; } // Delete (Eliminar) function deleteProduct($pdo, int $id) { $stmt = $pdo->prepare("DELETE FROM productos WHERE id = ?"); $stmt->execute([$id]); return ['status' => 'eliminado']; } // Leer todos los productos function getAllProducts($pdo) { return $pdo->query("SELECT * FROM productos")->fetchAll(); } |
Listo, ahora pasemos a probar nuestro CRUD.
5. Pruebas del CRUD
Usaré Postman, tu puedes usar tu herramienta favorita.
Estoy trabajando con XAMPP en Windows los cual
5.1 Create (Crear)
Vamos a crear un producto.
Abrimos una pestaña en Postman y seleccionamos el método POST.
Colocamos la URL: http://localhost/xampp/crud-php-8-mysql-8/index.php
Vamos a la pestaña Body, seleccionamos raw y colocamos los datos del producto en formato JSON:
|
1 2 3 4 5 6 |
{ "nombre": "Monitor Gamer 144Hz", "precio": 299.99 } |
Presionamos el botón Send.
Obtenemos como respuesta un JSON con el ID del producto creado.

5.2 Read (Leer)
Vamos a leer nuestro producto ingresado.
En Postman elegimos el método GET.
En esta tarea no enviaremos datos en JSON, al menos para nuestro ejemplo no es necesario.
Usamos la misma URL pero al final le pasamos el parámetro id con el id del producto que necesitamos leer: http://localhost/xampp/crud-php-8-mysql-8/index.php?id=1
Presionamos el botón Send.
Obtenemos como respuesta un JSON con todos los datos del producto:

5.3 Update (Actualizar)
Para actualizar nuestro producto en Postman elegimos el método PUT que es un estándar.
En la URL colocamos al final el id del poducto que queremos actualizar: http://localhost/xampp/crud-php-8-mysql-8/index.php?id=1
En la pestaña Body, seleccionamos raw y colocamos los datos en formato JSON para actualizar el producto:
|
1 2 3 4 5 6 |
{ "nombre": "Monitor Gamer UltraWide", "precio": 350.00 } |
Presionamos el botón Send.
Obtenemos como respuesta el status con el mensaje “actualizado”:

5.4 Delete (Eliminar)
Para esta tarea solo necesitamos enviar en la URL el id del producto que queremos eliminar: http://localhost/xampp/crud-php-8-mysql-8/index.php?id=1
Elegimos el método DELETE.
Presionamos el botón Send.
Y obtenemos como respuesta el status con el mensaje “eliminado”:

5.5 Listar todos los productos
Si necesitamos obtener todos los productos.
Elegimos el método GET.
Usamos la URL normal: http://localhost/xampp/crud-php-8-mysql-8/index.php
Presionamos el botón Send.
Recibimos como respuesta todos los productos con todos sus campos:

Ahora te compartiré unos tips para que tu aplicación con PHP 8 y MySQL 8 sea más óptima.
6. Datos Adicionales y Buenas Prácticas
Para que tu CRUD pase de ser un ejercicio a un proyecto profesional, considera estos puntos clave:
- Seguridad de Datos: Aunque usamos sentencias preparadas, siempre es recomendable limpiar las entradas con filter_var() para evitar ataques XSS si decides mostrar estos datos en un HTML.
- Códigos de Estado HTTP: En este tutorial usamos 200 OK (por defecto), 400 Bad Request, 404 Not Found y 405 Method Not Allowed. En una API profesional, el método POST debería devolver un código 201 Created.
- CORS (Cross-Origin Resource Sharing): Si planeas conectar este backend con un frontend en React, Angular o Vue, deberás configurar los encabezados CORS para permitir peticiones desde dominios externos.
- Manejo de Variables de Entorno: Por seguridad, nunca subas tus credenciales de base de datos (root, contraseñas) a repositorios como GitHub. Usa archivos .env para proteger esta información sensible.
7. Conclusión
Dominar la integración entre PHP 8 y MySQL 8 es una habilidad fundamental para cualquier desarrollador backend en la actualidad. Como hemos visto, la introducción de la expresión match, el tipado estricto en las funciones y el uso robusto de PDO no solo hacen que nuestro código sea más limpio y elegante, sino también mucho más seguro y fácil de mantener.
Este CRUD es el punto de partida perfecto. A partir de aquí, puedes escalar añadiendo autenticación con JWT (JSON Web Tokens), subida de imágenes de productos o incluso paginación para manejar miles de registros de forma eficiente.
¡La mejor forma de aprender es no dejar de picar código!

También en las categorías, etiquetas, búsquedas y más.
En versiones anteriores, se veian con alto disparejo.
Seguimos trabajando en mejorar la comunidad.



Seguimos trabajando las 24 horas del día para brindarte la mejor experiencia en la comunidad.
Hemos corregido el problema y ahora la web no muestra esa barra horizontal y se ve en su tamaño natural.
Seguimos trabajando las 24 horas del día, para mejorar la comunidad.
Seguimos trabajando las 24 horas y 365 días del año para mejorar tu experiencia en la comunidad.

Seguimos trabajando para brindarte le mejor experiencia en Nube Colectiva.
Social
Redes Sociales (Developers)
Redes Sociales (Digital)