🔐 Módulo 4 - Backend

PHP y MySQL desde cero: Conexión segura

¿Quieres conectar tu sitio web en PHP con una base de datos MySQL de forma segura? En esta guía aprenderás MySQLi, consultas CRUD, validación de datos y prevención de inyección SQL.

⏱️ ~15 min de lectura 🎯 Nivel: Intermedio 🔐 Con enfoque en seguridad

PHP es el lenguaje del lado del servidor que permite procesar datos y comunicarse con bases de datos. En esta guía aprenderás a usar MySQLi de forma segura, ejecutar consultas y proteger tu aplicación contra ataques comunes.

Conexión a MySQL usando MySQLi

Primero, crea un archivo conexion.php con los datos de tu base de datos:

🔗 Ejemplo: Conexión segura con MySQLi
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "mi_sitio";

// Crear conexión
$conn = new mysqli($servername, $username, $password, $dbname);

// Verificar conexión
if ($conn->connect_error) {
    // En producción: registrar en log, no mostrar al usuario
    error_log("Error de conexión: " . $conn->connect_error);
    die("Error de conexión. Intenta más tarde.");
}
echo "Conexión exitosa";
?>

Nota: En producción, nunca muestres errores detallados al usuario. Usa error_log() para registrarlos y muestra un mensaje genérico.

⚠️ Seguridad: Credenciales

Nunca hardcodees credenciales en producción. Usa variables de entorno o un archivo de configuración fuera del directorio público.

Consultas SQL: SELECT, INSERT, UPDATE, DELETE

Ejemplos de operaciones comunes con MySQLi:

📝 INSERT - Insertar datos

$sql = "INSERT INTO usuarios (nombre, email) 
VALUES ('Juan', 'juan@email.com')";

if ($conn->query($sql) === TRUE) {
    echo "Registro creado";
}

🔍 SELECT - Consultar datos

$sql = "SELECT id, nombre, email FROM usuarios";
$result = $conn->query($sql);

while($row = $result->fetch_assoc()) {
    echo $row["nombre"];
}

✏️ UPDATE - Actualizar datos

$sql = "UPDATE usuarios SET nombre='Pedro' 
WHERE id=1";

if ($conn->query($sql) === TRUE) {
    echo "Registro actualizado";
}

🗑️ DELETE - Eliminar datos

$sql = "DELETE FROM usuarios WHERE id=1";

if ($conn->query($sql) === TRUE) {
    echo "Registro eliminado";
}

Validación y sanitización de datos

Nunca confíes en los datos del usuario. Siempre valida y limpia:

🛡️ Ejemplo: Validar y sanitizar entrada
// Validar que no esté vacío
if (empty($_POST['email'])) {
    die("El correo es obligatorio");
}

// Sanitizar entrada
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);

// Validar formato de email
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    die("Formato de email inválido");
}

// Para nombres, usar htmlspecialchars para prevenir XSS
$nombre = htmlspecialchars($_POST['nombre'], ENT_QUOTES, 'UTF-8');
  • Usa filter_var() para validar emails, URLs y números
  • Usa htmlspecialchars() para prevenir XSS en salida
  • Valida siempre en el backend, no solo en frontend

¿Qué es una inyección SQL y cómo prevenirla?

🚨 Peligro: Inyección SQL

Un atacante puede manipular formularios para ejecutar código SQL malicioso. Ejemplo de ataque: ' OR '1'='1

Si no validas correctamente, un atacante podría:

  • Acceder a toda tu base de datos
  • Modificar o eliminar registros
  • Obtener credenciales de usuarios
✅ Solución: Sentencias preparadas

Usa prepared statements para separar el código SQL de los datos. Esto evita que el código sea interpretado como comando malicioso.

🔐 Ejemplo: Prepared statement seguro
// Preparar la sentencia
$stmt = $conn->prepare("INSERT INTO usuarios (nombre, email) VALUES (?, ?)");

// Vincular parámetros (ss = string, string)
$stmt->bind_param("ss", $nombre, $email);

// Ejecutar
$stmt->execute();

// Cerrar
$stmt->close();

Resultado: Los datos se envían separados del código SQL, haciendo imposible la inyección.

Errores comunes y cómo evitarlos

❌ No cerrar conexiones

Usa $conn->close(); al finalizar para liberar recursos.

❌ Mostrar errores en producción

Nunca uses die() o echo $conn->error en producción. Registra en logs y muestra mensajes genéricos.

❌ Olvidar validar

Siempre valida y sanitiza antes de insertar o consultar. La validación en frontend es solo para UX.

Depuración en PHP

Para ver el contenido de variables y detectar errores:

// Inspección detallada de variables
var_dump($variable);

// Salida más legible para arrays
print_r($array);

// Enviar a consola del navegador (útil para debug JS+PHP)
echo "<script>console.log('Debug: " . addslashes($valor) . "');</script>";

// Registrar errores en log (producción)
error_log("Error en línea " . __LINE__ . ": " . $mensaje);
💡 Tip de depuración

Activa display_errors = On solo en desarrollo. En producción, usa error_log() y revisa los logs del servidor.

¿Qué sigue después de PHP y MySQL?

Este es el cuarto paso del desarrollo full-stack. En el siguiente módulo, aprenderás a comunicar el frontend con el backend usando AJAX y APIs RESTful.

📚 ¿Quieres la versión completa del libro?

Esta guía es una versión resumida del libro "Programación Full-Stack", que incluye ejercicios resueltos, códigos listos y explicaciones profundas de seguridad.

Comprar en Amazon →

¿Tienes dudas sobre PHP, MySQL o seguridad? ¡Déjalas en los comentarios! 👇