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:
<?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.
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:
// 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?
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
Usa prepared statements para separar el código SQL de los datos. Esto evita que el código sea interpretado como comando malicioso.
// 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
Usa $conn->close(); al finalizar para liberar recursos.
Nunca uses die() o echo $conn->error en producción.
Registra en logs y muestra mensajes genéricos.
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);
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! 👇