En PHP existen varias variables superglobales que están siempre disponibles en cualquier parte del script. Todas comienzan con $_.
| Variable | Descripción | Ejemplo |
|---|---|---|
$_GET |
Datos enviados por la URL (query string). | $_GET['id'] |
$_POST |
Datos enviados por formularios con método POST. | $_POST['usuario'] |
$_REQUEST |
Combina $_GET, $_POST y $_COOKIE. |
$_REQUEST['dato'] |
$_COOKIE |
Acceso a cookies enviadas por el navegador. | $_COOKIE['idioma'] |
$_SESSION |
Variables de sesión (requiere session_start()). |
$_SESSION['user_id'] |
$_FILES |
Archivos subidos mediante formularios. | $_FILES['foto']['name'] |
$_SERVER |
Información del servidor y de la petición. | $_SERVER['REQUEST_METHOD'] |
$_ENV |
Variables de entorno del sistema o PHP. | $_ENV['PATH'] |
$GLOBALS |
Contiene todas las variables globales en un array. | $GLOBALS['miVar'] |
La superglobal $_GET se utiliza en PHP para acceder a los datos que se envían
en la URL después del signo ?.
Es muy común usarla para pasar parámetros entre páginas, como identificadores de usuario,
artículos, filtros de búsqueda, etc.
GET de formularios o con enlaces.$_GET['nombre_campo'].
pagina.php?usuario=Pablo&edad=30
| Variable | Valor |
|---|---|
$_GET['usuario'] |
Pablo |
$_GET['edad'] |
30 |
<?php // Capturar valores enviados por GET $usuario = $_GET['usuario']; $edad = $_GET['edad']; // Mostrar resultados echo "Usuario: " . $usuario; echo "Edad: " . $edad; ?>
<a href="pagina.php?usuario=Ana&edad=25">Ver datos de Ana</a>
<form action="pagina.php" method="get"> <label>Usuario:</label> <input type="text" name="usuario"> <label>Edad:</label> <input type="number" name="edad"> <button type="submit">Enviar</button> </form>Volver
La superglobal $_POST se utiliza en PHP para acceder a los datos que se envían
desde un formulario mediante el método POST.
Es ideal para enviar información sensible (como contraseñas) porque los datos no se muestran en la URL.
method="post".$_POST['nombre_campo'].<form action="pagina.php" method="post"> <label>Usuario:</label> <input type="text" name="usuario"> <label>Contraseña:</label> <input type="password" name="clave"> <button type="submit">Enviar</button> </form>
<?php // Capturar valores enviados por POST $usuario = $_POST['usuario']; $clave = $_POST['clave']; // Mostrar resultados (nunca mostrar contraseñas en un sistema real) echo "Usuario: " . $usuario; echo "Clave: " . $clave; ?>
| Aspecto | $_GET | $_POST |
|---|---|---|
| Visibilidad | Parámetros visibles en la URL | Datos ocultos en el cuerpo de la petición |
| Uso común | Filtros, búsquedas, navegación | Formularios de login, registros, carga de datos sensibles |
| Límite de datos | Limitado por la longitud de la URL | Permite enviar mucha más información |
La superglobal $_REQUEST en PHP permite acceder a datos enviados por
GET, POST y COOKIE.
Es como un contenedor que mezcla esas tres fuentes en un solo array asociativo.
$_GET, $_POST y $_COOKIE.$_GET o $_POST directamente para mayor claridad).$_REQUEST['campo'].php.ini (directiva variables_order).<form action="pagina.php" method="post"> <label>Usuario:</label> <input type="text" name="usuario"> <label>Edad:</label> <input type="number" name="edad"> <button type="submit">Enviar</button> </form>
<?php // Capturar valores enviados por GET, POST o COOKIE $usuario = $_REQUEST['usuario']; $edad = $_REQUEST['edad']; echo "Usuario: " . $usuario; echo "Edad: " . $edad; ?>
| Variable | Origen de datos | Uso recomendado |
|---|---|---|
$_GET |
Parámetros en la URL | Filtros, navegación, búsquedas |
$_POST |
Formulario enviado por POST | Datos sensibles, login, registro |
$_REQUEST |
GET + POST + COOKIE | Cuando no importa de dónde viene el dato (poco usado en apps seguras) |
La superglobal $_COOKIE permite acceder a las cookies que el
navegador envía al servidor.
Una cookie es un pequeño archivo de texto que el servidor guarda en el navegador del usuario,
y que luego se reenvía automáticamente en cada petición.
setcookie() en PHP.$_COOKIE['nombre'].
<?php
// Crear una cookie llamada "usuario" con valor "Pablo"
// Expira en 1 hora (3600 segundos)
setcookie("usuario", "Pablo", time() + 3600);
// Leer la cookie (estará disponible en la próxima carga de página)
if (isset($_COOKIE['usuario'])) {
echo "Bienvenido, " . $_COOKIE['usuario'];
} else {
echo "No hay cookie de usuario.";
}
?>
| Función | Ejemplo | Descripción |
|---|---|---|
setcookie() |
setcookie("idioma","es",time()+3600); |
Crea una cookie llamada idioma con valor es, expira en 1 hora. |
$_COOKIE['idioma'] |
echo $_COOKIE['idioma']; |
Lee el valor de la cookie idioma. |
$_SESSION permite guardar datos del usuario en el servidor durante su navegación.
A diferencia de las cookies, la información no viaja en cada request: el servidor la relaciona con el usuario
mediante un session ID (típicamente en la cookie PHPSESSID).
$_SESSION debés llamar a session_start() antes de enviar cualquier salida al navegador.
<?php // Iniciar la sesión (debe ir antes de cualquier echo/HTML) session_start(); // Escribir valores $_SESSION['user_id'] = 123; $_SESSION['usuario'] = 'Pablo'; $_SESSION['rol'] = 'admin'; // Leer valores echo $_SESSION['usuario']; // Pablo ?>
session_status() (recomendado)
<?php
if (session_status() === PHP_SESSION_ACTIVE) {
echo "La sesión está abierta ✅";
} else {
echo "No hay sesión activa ❌";
}
?>
session_id() (tras intentar abrirla)
<?php
session_start(); // intenta abrir/crear sesión
if (session_id() !== "") {
echo "Hay una sesión activa ✅";
} else {
echo "No hay sesión activa ❌";
}
?>
$_SESSION
<?php
session_start();
if (!empty($_SESSION)) {
echo "Sesión abierta y con datos:";
var_dump($_SESSION);
} else {
echo "No hay variables en la sesión.";
}
?>
Nota: el método 3 verifica que haya datos guardados, no solo que la sesión exista. Para saber si
la sesión está activa, preferí session_status().
<?php
session_start();
// Quitar variables
session_unset();
// Destruir la sesión en el servidor
session_destroy();
// (Opcional) Borrar cookie de sesión en el cliente
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// Redirigir al inicio (opcional)
// header("Location: /");
?>
session_start() al comienzo del script (antes de cualquier salida).session_regenerate_id(true) (previene fijación de sesión).
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$user = $_POST['usuario'] ?? '';
$pass = $_POST['clave'] ?? '';
// (Ejemplo simplificado; en producción: consultar BD + password_verify)
if ($user === 'admin' && $pass === '1234') {
session_regenerate_id(true);
$_SESSION['user_id'] = 1;
$_SESSION['usuario'] = $user;
$_SESSION['rol'] = 'admin';
echo "Login OK ✅";
} else {
echo "Credenciales inválidas ❌";
}
}
?>
| Aspecto | $_SESSION | $_COOKIE |
|---|---|---|
| Ubicación de datos | Servidor | Navegador del usuario |
| Transmisión | No viajan los datos en cada request | Se envían en cada request al servidor |
| Seguridad | Más seguro por defecto (no expone datos) | Requiere cuidado; visible y manipulable en cliente |
| Uso típico | Login, carrito, estado por usuario | Preferencias, recordar idioma/tema |
session_name(): nombre de la sesión (cookie).session_get_cookie_params(): parámetros de la cookie de sesión.ini_get('session.save_path'): directorio donde se guardan archivos de sesión.
$_FILES es una superglobal que contiene la información de los archivos
subidos mediante un formulario con method="post" y
enctype="multipart/form-data". Cada input de tipo file genera
una entrada en $_FILES.
Para un input <input type="file" name="foto">, se obtiene:
| Índice | Descripción | Ejemplo |
|---|---|---|
$_FILES['foto']['name'] | Nombre original del archivo | avatar.png |
$_FILES['foto']['type'] | Tipo MIME (según el navegador) | image/png |
$_FILES['foto']['size'] | Tamaño en bytes | 34567 |
$_FILES['foto']['tmp_name'] | Ruta temporal en el servidor | /tmp/php7aBcDe |
$_FILES['foto']['error'] | Código de error | 0 (éxito) |
<form action="subir.php" method="post" enctype="multipart/form-data"> <label>Seleccioná una imagen:</label> <input type="file" name="foto" accept="image/*"> <button type="submit">Subir</button> </form>
<?php
// subir.php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_FILES['foto']) && $_FILES['foto']['error'] === UPLOAD_ERR_OK) {
$tmp = $_FILES['foto']['tmp_name'];
$name = basename($_FILES['foto']['name']); // OJO: sanitizar
$dest = __DIR__ . '/uploads/' . $name;
// Crear carpeta si no existe
if (!is_dir(__DIR__ . '/uploads')) {
mkdir(__DIR__ . '/uploads', 0775, true);
}
if (move_uploaded_file($tmp, $dest)) {
echo "✅ Archivo subido a: " . $dest;
} else {
echo "❌ No se pudo mover el archivo.";
}
} else {
echo "❌ Error en la subida: " . ($_FILES['foto']['error'] ?? 'sin archivo');
}
}
?>
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$maxBytes = 2 * 1024 * 1024; // 2 MB
$permitidos = ['image/jpeg','image/png','image/gif'];
if (!isset($_FILES['foto']) || $_FILES['foto']['error'] !== UPLOAD_ERR_OK) {
die("Error en la carga.");
}
// Tamaño
if ($_FILES['foto']['size'] > $maxBytes) {
die("Archivo demasiado grande (máx 2MB).");
}
// Tipo MIME (verificación doble: MIME + extensión)
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime = $finfo->file($_FILES['foto']['tmp_name']);
if (!in_array($mime, $permitidos, true)) {
die("Tipo no permitido.");
}
// Nombre seguro (evitar rutas y caracteres raros)
$ext = pathinfo($_FILES['foto']['name'], PATHINFO_EXTENSION);
$nombreSeguro = bin2hex(random_bytes(8)) . '.' . strtolower($ext);
$dest = __DIR__ . '/uploads/' . $nombreSeguro;
if (!is_dir(__DIR__ . '/uploads')) mkdir(__DIR__ . '/uploads', 0775, true);
if (move_uploaded_file($_FILES['foto']['tmp_name'], $dest)) {
echo "Subido como: " . htmlspecialchars($nombreSeguro);
} else {
echo "No se pudo guardar el archivo.";
}
}
?>
| Constante | Valor | Significado |
|---|---|---|
UPLOAD_ERR_OK | 0 | Éxito |
UPLOAD_ERR_INI_SIZE | 1 | Excede upload_max_filesize de php.ini |
UPLOAD_ERR_FORM_SIZE | 2 | Excede MAX_FILE_SIZE del formulario |
UPLOAD_ERR_PARTIAL | 3 | Archivo subido parcialmente |
UPLOAD_ERR_NO_FILE | 4 | No se subió archivo |
UPLOAD_ERR_NO_TMP_DIR | 6 | Falta carpeta temporal |
UPLOAD_ERR_CANT_WRITE | 7 | Error al escribir en disco |
UPLOAD_ERR_EXTENSION | 8 | Extensión de PHP detuvo la subida |
file_uploads = On (habilita subidas).upload_max_filesize (tamaño máx. por archivo, ej. 8M).post_max_size (límite total del POST; debe ser ≥ upload_max_filesize).max_file_uploads (máximo de archivos por request).upload_tmp_dir (directorio temporal).enctype="multipart/form-data" en el formulario.public_html si es posible.move_uploaded_file() (no rename()).$_FILES['type']; validar con finfo.$_SERVER es un array asociativo que contiene información sobre la petición HTTP, el servidor y el entorno de ejecución. Incluye datos como el método de la request, la URL, cabeceras, IP del cliente, nombre del host, ruta del script, etc.
isset().
| Índice | Descripción | Ejemplo |
|---|---|---|
$_SERVER['REQUEST_METHOD'] |
Método HTTP utilizado | GET / POST |
$_SERVER['REQUEST_URI'] |
Ruta solicitada (con query string) | /productos/listar?page=2 |
$_SERVER['QUERY_STRING'] |
Cadena de consulta (parte después de ?) |
page=2&orden=asc |
$_SERVER['HTTP_HOST'] |
Host enviado por el cliente | example.com |
$_SERVER['HTTP_USER_AGENT'] |
User-Agent del navegador/cliente | Mozilla/5.0 ... |
$_SERVER['HTTPS'] |
Presente si la conexión es HTTPS (depende del servidor) | on / 1 |
$_SERVER['REMOTE_ADDR'] |
IP del cliente (ojo con proxies) | 203.0.113.25 |
$_SERVER['SERVER_NAME'] |
Nombre del servidor | example.com |
$_SERVER['SERVER_ADDR'] |
IP del servidor | 192.0.2.10 |
$_SERVER['SERVER_PROTOCOL'] |
Protocolo | HTTP/1.1, HTTP/2 |
$_SERVER['SCRIPT_NAME'] |
Ruta del script ejecutado | /public/index.php |
$_SERVER['DOCUMENT_ROOT'] |
Raíz del documento del servidor | /var/www/html |
<?php $metodo = $_SERVER['REQUEST_METHOD'] ?? ''; $uri = $_SERVER['REQUEST_URI'] ?? ''; $protocolo= $_SERVER['SERVER_PROTOCOL'] ?? ''; echo "Método: $metodo\nURI: $uri\nProtocolo: $protocolo"; ?>
<?php
$esHttps = false;
if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') {
$esHttps = true;
}
// Detrás de proxy/reverse proxy:
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$esHttps = true;
}
echo $esHttps ? "Conexión segura (HTTPS)" : "Conexión no segura (HTTP)";
?>
<?php
function ipCliente(): string {
$cabeceras = [
'HTTP_CLIENT_IP',
'HTTP_X_FORWARDED_FOR',
'HTTP_X_FORWARDED',
'HTTP_X_CLUSTER_CLIENT_IP',
'HTTP_FORWARDED_FOR',
'HTTP_FORWARDED',
'REMOTE_ADDR'
];
foreach ($cabeceras as $h) {
if (!empty($_SERVER[$h])) {
// X-Forwarded-For puede traer una lista de IPs
$ips = explode(',', $_SERVER[$h]);
foreach ($ips as $ip) {
$ip = trim($ip);
if (filter_var($ip, FILTER_VALIDATE_IP)) {
return $ip;
}
}
}
}
return 'desconocida';
}
echo "IP cliente: " . ipCliente();
?>
<?php
// Si está disponible:
if (function_exists('getallheaders')) {
$headers = getallheaders();
foreach ($headers as $k => $v) {
echo $k . ': ' . $v . "\n";
}
} else {
// Alternativa: recorrer $_SERVER con prefijo HTTP_
foreach ($_SERVER as $k => $v) {
if (strpos($k, 'HTTP_') === 0) {
echo $k . ': ' . $v . "\n";
}
}
}
?>
<?php
$esHttps = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
|| (($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? '') === 'https');
$scheme = $esHttps ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'] ?? 'localhost';
$uri = $_SERVER['REQUEST_URI'] ?? '/';
$urlActual = $scheme . '://' . $host . $uri;
echo $urlActual;
?>
<?php $script = $_SERVER['SCRIPT_NAME'] ?? ''; $root = $_SERVER['DOCUMENT_ROOT'] ?? ''; echo "SCRIPT_NAME: $script\nDOCUMENT_ROOT: $root"; ?>
isset() o el operador null-coalescing ??.X-Forwarded-For, X-Forwarded-Proto) configuradas por tu proxy.$_SERVER['HTTP_*']: pueden ser manipuladas por el cliente si tu proxy/servidor no las filtra.
La superglobal $_ENV contiene variables de entorno disponibles para el script PHP.
Estas variables suelen provenir del sistema operativo, de la configuración de php.ini
o de archivos de configuración externos (por ejemplo, un .env en frameworks modernos).
$_ENV directamente, en muchos servidores
las variables de entorno también están disponibles mediante getenv().
<?php
// Acceder a una variable de entorno
echo $_ENV['PATH'];
// O usando getenv()
echo getenv('PATH');
?>
export MI_VAR=holaset MI_VAR=holaenv[MI_VAR] = hola<?php // Archivo de configuración $_ENV['DB_HOST'] = "localhost"; $_ENV['DB_USER'] = "root"; $_ENV['DB_PASS'] = "secreto"; // Uso en conexión $host = $_ENV['DB_HOST']; $user = $_ENV['DB_USER']; $pass = $_ENV['DB_PASS']; echo "Conectando a la BD en $host con usuario $user"; ?>
| Superglobal | Fuente | Uso común |
|---|---|---|
$_ENV |
Variables de entorno del sistema/servidor | Configurar BD, API keys, rutas |
$_SERVER |
Info del servidor y de la petición | Método HTTP, cabeceras, ruta del script |
$_COOKIE |
Datos almacenados en el navegador | Preferencias, recordar usuario |
$_SESSION |
Datos guardados en el servidor por usuario | Login, carrito de compras |
La superglobal $GLOBALS es un array asociativo que contiene todas las
variables definidas en el ámbito global del script PHP.
Permite acceder a variables globales desde funciones o métodos sin necesidad de usar la palabra clave
global.
$GLOBALS con cuidado. Si bien puede ser útil para
debugging o casos puntuales, abusar de variables globales dificulta el mantenimiento del código.
<?php
$numero = 42;
function mostrarNumero() {
echo $GLOBALS['numero']; // Accede a $numero desde dentro de la función
}
mostrarNumero(); // 42
?>
global
<?php
$mensaje = "Hola mundo";
// Usando global
function ejemplo1() {
global $mensaje;
echo $mensaje;
}
// Usando $GLOBALS
function ejemplo2() {
echo $GLOBALS['mensaje'];
}
ejemplo1(); // Hola mundo
ejemplo2(); // Hola mundo
?>
var_dump($GLOBALS)).
<?php
$usuario = "Pablo";
$rol = "admin";
var_dump($GLOBALS);
/*
array( ... ) {
["usuario"] => string(5) "Pablo"
["rol"] => string(5) "admin"
["GLOBALS"] => &array(...) // referencia a sí mismo
}
*/
?>
| Característica | Descripción |
|---|---|
| Tipo | Array asociativo |
| Clave | Nombre de la variable global (ej: "usuario") |
| Valor | Contenido de la variable global |
| Alcance | Disponible en cualquier parte del script |