PHP Práctico: Los fundamentos que necesitas antes de crear aplicaciones web

Domina require, include, $_POST, $_GET y la estructura básica de PHP. Los fundamentos esenciales que todo principiante necesita saber

¿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:

Diferencias entre require, include, require_once
Cuándo usar GET vs POST (con ejemplos visuales)
Manejar $_GET, $_POST, $_SESSION como un pro
Crear formularios HTML que funcionen con PHP
Organizar archivos PHP de forma profesional
Validar datos de forma segura
Manejar errores sin mostrar información sensible

🛠️ Preparando el entorno

Necesitas XAMPP funcionando (si no lo tienes, descárgalo de apachefriends.org)

  1. Abre XAMPP Control Panel
  2. Inicia Apache
  3. Crea carpeta fundamentos_php en C:\xampp\htdocs\

📁 require vs include: ¿Cuál usar y cuándo?

La diferencia es simple pero crucial:

require Si el archivo no existe → Error FATAL (se para todo)
include Si el archivo no existe → Warning (continúa ejecutando)
require_once Como require, pero solo incluye UNA vez
include_once Como include, pero solo incluye UNA vez

✅ 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:

GET Para OBTENER datos - visible en URL - como Google search
POST Para ENVIAR datos - oculto - como login o formularios

📝 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.

$_GET Datos de la URL (?nombre=valor)
$_POST Datos de formularios (ocultos)
$_SESSION Datos que persisten entre páginas
$_SERVER Información del servidor y petición

📊 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:

  1. La página principal debe cargar sin errores
  2. Haz clic en "Ver Ejemplo GET" → prueba el buscador
  3. Busca "iPhone" → debe aparecer en resultados
  4. Haz clic en "Ver Ejemplo POST" → prueba el formulario
  5. Llena mal el email → debe mostrar error
  6. Llénalo bien → debe mostrar éxito
  7. 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 conectada

Aprende a crear un sistema completo para gestionar datos con PHP, MySQL y buenas prácticas de seguridad