¿Por qué tu código PHP se rompe cuando intentas separar archivos? ¿Te confunden $_POST y $_GET? ¿No sabes cuándo usar require o include?
Si has intentado crear una aplicación PHP y te has perdido con los includes, formularios que no funcionan, o errores raros... este tutorial es para ti.
Vamos a dominar los fundamentos PHP que realmente necesitas antes de crear aplicaciones web. Sin teoría aburrida, solo código que funciona.
🤔 ¿Qué vamos a aprender?
🎯 Al terminar este tutorial sabrás:
🛠️ Preparando el entorno
Necesitas XAMPP funcionando (si no lo tienes, descárgalo de apachefriends.org)
- Abre XAMPP Control Panel
- Inicia Apache
- Crea carpeta fundamentos_php en C:\xampp\htdocs\
📁 require vs include: ¿Cuál usar y cuándo?
La diferencia es simple pero crucial:
✅ Cuándo usar cada uno
Crear archivo config.php:
<?php
// ✅ Configuración crítica - usar require_once
$host = "localhost";
$app_name = "Mi Primera App";
$version = "1.0";
function obtenerFechaActual() {
return date("Y-m-d H:i:s");
}
?>
Crear archivo header.php:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title><?php echo $app_name; ?></title>
<style>
body { font-family: Arial; margin: 20px; }
.container { max-width: 800px; margin: 0 auto; }
.header { background: #007cba; color: white; padding: 20px; text-align: center; }
form { background: #f5f5f5; padding: 20px; margin: 20px 0; }
input, button { padding: 10px; margin: 5px; }
button { background: #28a745; color: white; border: none; }
.success { color: green; background: #d4edda; padding: 10px; }
.error { color: red; background: #f8d7da; padding: 10px; }
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1><?php echo $app_name; ?></h1>
<p>Versión: <?php echo $version; ?></p>
</div>
Crear archivo footer.php:
<footer style="text-align: center; margin-top: 40px; padding: 20px; border-top: 1px solid #ccc;">
<p>© 2025 Mi Primera App - Generado el: <?php echo obtenerFechaActual(); ?></p>
</footer>
</div>
</body>
</html>
Ahora crear archivo ejemplo_includes.php:
<?php
// ✅ SIEMPRE usar require_once para configuración crítica
require_once 'config.php';
// ✅ require para archivos esenciales
require 'header.php';
?>
<h2>¡Hola! Esta página usa includes</h2>
<p>El header y footer se incluyen desde archivos separados.</p>
<?php
// ✅ include para footer (no crítico)
include 'footer.php';
?>
💡 Regla de oro:
- require_once: Configuración, conexiones DB, funciones críticas
- require: Headers, archivos esenciales para que la página funcione
- include: Footers, sidebars, contenido opcional
🌐 GET vs POST: ¿Cuándo usar cada uno?
Esta es la confusión #1 de principiantes. Te lo explico simple:
📝 Ejemplo práctico: Búsqueda (GET)
Crear archivo busqueda.php:
<?php
require_once 'config.php';
require 'header.php';
// ✅ Manejar búsqueda con GET
$termino_busqueda = "";
$resultados = [];
if (isset($_GET['buscar']) && !empty($_GET['buscar'])) {
$termino_busqueda = htmlspecialchars($_GET['buscar']);
// ✅ Simulamos una búsqueda
$productos = ['iPhone', 'Samsung', 'Huawei', 'Xiaomi'];
foreach ($productos as $producto) {
if (stripos($producto, $termino_busqueda) !== false) {
$resultados[] = $producto;
}
}
}
?>
<h2>🔍 Buscador (Método GET)</h2>
<form method="GET">
<label>¿Qué buscas?</label>
<input type="text" name="buscar" value="<?= htmlspecialchars($termino_busqueda) ?>" placeholder="Escribe aquí...">
<button type="submit">🔍 Buscar</button>
</form>
<?php if ($termino_busqueda): ?>
<h3>Resultados para: "<?php echo $termino_busqueda; ?>"</h3>
<?php if (count($resultados) > 0): ?>
<ul>
<?php foreach ($resultados as $resultado): ?>
<li>✅ <?php echo $resultado; ?></li>
<?php endforeach; ?>
</ul>
<?php else: ?>
<p>❌ No se encontraron resultados</p>
<?php endif; ?>
<?php endif; ?>
<p><a href="formulario_contacto.php">📝 Ir al formulario de contacto (POST)</a></p>
<?php include 'footer.php'; ?>
📧 Ejemplo práctico: Contacto (POST)
Crear archivo formulario_contacto.php:
<?php
require_once 'config.php';
require 'header.php';
$mensaje = "";
$tipo_mensaje = "";
// ✅ Procesar formulario POST
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// ✅ Validación básica
$nombre = trim($_POST['nombre'] ?? '');
$email = trim($_POST['email'] ?? '');
$mensaje_usuario = trim($_POST['mensaje'] ?? '');
// ✅ Validaciones
if (empty($nombre)) {
$mensaje = "❌ El nombre es obligatorio";
$tipo_mensaje = "error";
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$mensaje = "❌ Email inválido";
$tipo_mensaje = "error";
} elseif (empty($mensaje_usuario)) {
$mensaje = "❌ El mensaje no puede estar vacío";
$tipo_mensaje = "error";
} else {
// ✅ Todo válido - simular envío
$mensaje = "✅ ¡Gracias $nombre! Tu mensaje ha sido enviado correctamente.";
$tipo_mensaje = "success";
// ✅ Limpiar campos después del éxito
$nombre = $email = $mensaje_usuario = "";
}
}
?>
<h2>📧 Formulario de Contacto (Método POST)</h2>
<?php if ($mensaje): ?>
<div class="<?= $tipo_mensaje ?>">
<?php echo $mensaje; ?>
</div>
<?php endif; ?>
<form method="POST">
<div>
<label>Nombre completo: *</label><br>
<input type="text" name="nombre" value="<?= htmlspecialchars($nombre ?? '') ?>" required>
</div>
<div>
<label>Email: *</label><br>
<input type="email" name="email" value="<?= htmlspecialchars($email ?? '') ?>" required>
</div>
<div>
<label>Mensaje: *</label><br>
<textarea name="mensaje" rows="5" required><?php echo htmlspecialchars($mensaje_usuario ?? ''); ?></textarea>
</div>
<button type="submit">📧 Enviar Mensaje</button>
</form>
<p><a href="busqueda.php">🔍 Volver al buscador (GET)</a></p>
<?php include 'footer.php'; ?>
⚠️ Diferencias clave:
- GET: Los datos aparecen en la URL (busqueda.php?buscar=iPhone)
- POST: Los datos van ocultos en el cuerpo de la petición
- GET: Se puede compartir la URL con resultados
- POST: Mejor para datos privados (contraseñas, formularios)
🔐 Superglobales: $_GET, $_POST, $_SESSION
Las superglobales están disponibles SIEMPRE, en cualquier función o archivo.
📊 Ejemplo: Información del servidor
Crear archivo info_servidor.php:
<?php
require_once 'config.php';
require 'header.php';
?>
<h2>🖥️ Información del Servidor ($_SERVER)</h2>
<table style="width: 100%; border-collapse: collapse;">
<tr style="background: #f5f5f5;">
<th style="padding: 10px; border: 1px solid #ddd;">Variable</th>
<th style="padding: 10px; border: 1px solid #ddd;">Valor</th>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;">REQUEST_METHOD</td>
<td style="padding: 8px; border: 1px solid #ddd;"><?php echo $_SERVER['REQUEST_METHOD']; ?></td>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;">HTTP_HOST</td>
<td style="padding: 8px; border: 1px solid #ddd;"><?php echo $_SERVER['HTTP_HOST']; ?></td>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;">REQUEST_URI</td>
<td style="padding: 8px; border: 1px solid #ddd;"><?php echo $_SERVER['REQUEST_URI']; ?></td>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;">HTTP_USER_AGENT</td>
<td style="padding: 8px; border: 1px solid #ddd;"><?php echo substr($_SERVER['HTTP_USER_AGENT'], 0, 50) . "..."; ?></td>
</tr>
</table>
<h3>🔍 Debug: Ver datos GET y POST</h3>
<div style="background: #f8f9fa; padding: 15px; margin: 10px 0;">
<strong>$_GET:</strong>
<pre><?php print_r($_GET); ?></pre>
</div>
<div style="background: #f8f9fa; padding: 15px; margin: 10px 0;">
<strong>$_POST:</strong>
<pre><?php print_r($_POST); ?></pre>
</div>
<p>Prueba esto: Ve a info_servidor.php?nombre=Juan&edad=25 y verás los datos en $_GET</p>
<p>
<a href="busqueda.php">🔍 Ir al buscador</a> |
<a href="formulario_contacto.php">📧 Ir al contacto</a>
</p>
<?php include 'footer.php'; ?>
🏗️ Estructura de proyecto PHP
Organizar bien los archivos desde el principio te ahorra dolores de cabeza:
fundamentos_php/
├─ index.php # Página principal
├─ config.php # Configuración global
├─ header.php # Header común
├─ footer.php # Footer común
├─ busqueda.php # Funcionalidad búsqueda
├─ formulario_contacto.php # Formulario
├─ info_servidor.php # Debug info
└─ includes/ # Funciones adicionales
└─ functions.php
Crear archivo includes/functions.php:
<?php
// ✅ Funciones útiles para el proyecto
function limpiarTexto($texto) {
return htmlspecialchars(trim($texto));
}
function validarEmail($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}
function redirigir($url) {
header("Location: $url");
exit;
}
function esMetodoPost() {
return $_SERVER['REQUEST_METHOD'] === 'POST';
}
function mostrarMensaje($mensaje, $tipo = 'info') {
$clases = [
'success' => 'color: green; background: #d4edda; padding: 10px;',
'error' => 'color: red; background: #f8d7da; padding: 10px;',
'info' => 'color: blue; background: #d1ecf1; padding: 10px;'
];
$estilo = $clases[$tipo] ?? $clases['info'];
return "<div style='$estilo'>$mensaje</div>";
}
?>
Crear archivo index.php principal:
<?php
// ✅ Página principal del proyecto
require_once 'config.php';
require_once 'includes/functions.php';
require 'header.php';
?>
<h2>🎉 ¡Bienvenido a PHP Fundamentos!</h2>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin: 20px 0;">
<div style="padding: 20px; background: #f8f9fa; border: 1px solid #ddd;">
<h3>🔍 Método GET</h3>
<p>Para búsquedas y obtener datos</p>
<a href="busqueda.php" style="background: #007cba; color: white; padding: 10px; text-decoration: none; display: inline-block;">Ver Ejemplo GET</a>
</div>
<div style="padding: 20px; background: #f8f9fa; border: 1px solid #ddd;">
<h3>📧 Método POST</h3>
<p>Para formularios y datos privados</p>
<a href="formulario_contacto.php" style="background: #28a745; color: white; padding: 10px; text-decoration: none; display: inline-block;">Ver Ejemplo POST</a>
</div>
</div>
<h3>🛠️ Herramientas de Debug</h3>
<p><a href="info_servidor.php">🖥️ Ver información del servidor</a></p>
<?php
// ✅ Ejemplo de uso de nuestras funciones
echo mostrarMensaje("✅ Sistema PHP funcionando correctamente!", 'success');
?>
<h3>📚 ¿Qué has aprendido?</h3>
<ul>
<li>✅ Diferencias entre require, include, require_once</li>
<li>✅ Cuándo usar GET vs POST</li>
<li>✅ Superglobales: $_GET, $_POST, $_SERVER</li>
<li>✅ Validar datos de forma segura</li>
<li>✅ Organizar proyectos PHP profesionalmente</li>
</ul>
<?php include 'footer.php'; ?>
🎯 Probando tu aplicación
Ve a http://localhost/fundamentos_php/ y prueba:
- La página principal debe cargar sin errores
- Haz clic en "Ver Ejemplo GET" → prueba el buscador
- Busca "iPhone" → debe aparecer en resultados
- Haz clic en "Ver Ejemplo POST" → prueba el formulario
- Llena mal el email → debe mostrar error
- Llénalo bien → debe mostrar éxito
- Ve a "Información del servidor" → debe mostrar datos del sistema
🔍 Validación y manejo de errores
💪 Buenas prácticas que ya estás usando:
- htmlspecialchars(): Previene XSS (Cross-Site Scripting)
- filter_var(): Valida emails correctamente
- trim(): Elimina espacios innecesarios
- empty() e isset(): Verifica datos antes de usarlos
- $_SERVER['REQUEST_METHOD']: Controla cómo llegan los datos
⚠️ Errores comunes que ya evitas:
- No validar datos: Siempre validamos antes de usar
- Mezclar require/include: Ahora sabes cuándo usar cada uno
- No limpiar outputs: htmlspecialchars() siempre
- Archivos desorganizados: Estructura clara desde el inicio
💡 ¿Qué sigue después?
Con estos fundamentos sólidos, ya estás listo para crear aplicaciones más avanzadas:
🚀 Siguiente paso lógico:
- Conectar con base de datos: MySQL + PHP
- Crear sistemas CRUD: Crear, leer, actualizar, eliminar
- Manejo de sesiones: Login y autenticación
- APIs y formularios avanzados: Subida de archivos
🎯 ¿Listo para crear tu primera aplicación con base de datos?
Ya dominas los fundamentos PHP. Es hora de conectar con MySQL y crear tu primer CRUD completo.
👉 PHP y MySQL CRUD: Tu primera base de datos conectadaAprende a crear un sistema completo para gestionar datos con PHP, MySQL y buenas prácticas de seguridad