Cómo crear tu propio sistema de redirección con estadísticas en PHP y MySQL

¿Alguna vez quisiste saber cuántos usuarios hacen clic en un enlace que compartes? ¿O esconder la URL real de tus enlaces de afiliado o campañas? En este artículo, te mostraré cómo crear tu propio sistema de redirección con estadísticas, completamente personalizado en PHP y MySQL.

✨ ¿Qué es un sistema de redirección con estadísticas?

Es una herramienta que:

  • Redirige a los usuarios a un enlace final (por ejemplo, un producto).
  • Registra información sobre el clic: IP, navegador, origen, fecha, etc.
  • Te permite crear URLs limpias como https://tusitio.com/go/oferta.

🧱 1. Estructura básica de la base de datos

Tabla go: almacena los enlaces

CREATE TABLE go (
    id INT AUTO_INCREMENT PRIMARY KEY,
    slug VARCHAR(255) UNIQUE,
    real_url TEXT,
    clicks INT DEFAULT 0,
    created_at DATETIME,
    last_click_at DATETIME,
    `order_by` INT NOT NULL DEFAULT 1,
    `status` TINYINT(1) NOT NULL DEFAULT 1
);

Tabla go_clicks: almacena cada clic

CREATE TABLE go_clicks (
    id INT AUTO_INCREMENT PRIMARY KEY,
    go_id INT,
    clicked_at DATETIME,
    ip VARCHAR(45),
    user_agent TEXT,
    referrer TEXT,
    `order_by` INT NOT NULL DEFAULT 1,
    `status` TINYINT(1) NOT NULL DEFAULT 1,
    FOREIGN KEY (go_id) REFERENCES go(id)
);

⚙️ 2. Código PHP para procesar el enlace (go.php)

Este archivo recibe el parámetro ?s=slug o ?i=id, registra el clic, y redirige:

<?php
require_once 'admin/conect_db.php';

$slug = $_GET['s'] ?? null;
$id   = $_GET['i'] ?? null;

if (!$slug && !$id) {
    http_response_code(400);
    exit('Enlace inválido');
}

if ($slug) {
    $stmt = $db->prepare("SELECT * FROM go WHERE slug = ? AND status = 1 LIMIT 1");
    $stmt->execute([$slug]);
} else {
    $stmt = $db->prepare("SELECT * FROM go WHERE id = ? AND status = 1 LIMIT 1");
    $stmt->execute([$id]);
}

$go = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$go) {
    http_response_code(404);
    exit('Enlace no encontrado o desactivado');
}

// Insertar clic
$click_sql = "INSERT INTO go_clicks (go_id, clicked_at, ip, user_agent, referrer, order_by, status)
              VALUES (?, NOW(), ?, ?, ?, 1, 1)";
$click_stmt = $db->prepare($click_sql);
$click_stmt->execute([
    $go['id'],
    $_SERVER['REMOTE_ADDR'],
    $_SERVER['HTTP_USER_AGENT'],
    $_SERVER['HTTP_REFERER'] ?? ''
]);

// Actualizar contador
$db->prepare("UPDATE go SET clicks = clicks + 1, last_click_at = NOW() WHERE id = ?")
   ->execute([$go['id']]);

header('Location: ' . $go['real_url']);
exit;
?>

🧼 3. URLs limpias con .htaccess

Para permitir URLs como https://tusitio.com/go/nombre-del-enlace, crea un archivo .htaccess:

RewriteEngine On

# Acceso por slug: /go/mi-enlace → go.php?s=mi-enlace
RewriteRule ^go/([a-zA-Z0-9\-_]+)/?$ go.php?s=$1 [L,QSA]

# Acceso por ID: /go/id/123 → go.php?i=123
RewriteRule ^go/id/([0-9]+)/?$ go.php?i=$1 [L,QSA]

👁️ 4. Crear un enlace desde el panel de administración

Inserta un nuevo enlace manualmente o desde un formulario:

INSERT INTO go (slug, real_url, created_at)
VALUES ('oferta-verano', 'https://afiliado.com/producto123', NOW());

Ahora puedes compartir:

https://tusitio.com/go/oferta-verano

📊 5. Ver las estadísticas

Puedes mostrar estadísticas básicas como esta:

<?php
$sql = "SELECT g.slug, g.real_url, g.clicks, MAX(gc.clicked_at) AS last_click
        FROM go g
        LEFT JOIN go_clicks gc ON gc.go_id = g.id
        GROUP BY g.id
        ORDER BY g.created_at DESC";

$stmt = $db->query($sql);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<table>
    <tr><th>Slug</th><th>Clicks</th><th>Último clic</th></tr>
    <?php foreach ($results as $row): ?>
        <tr>
            <td><?= htmlspecialchars($row['slug']) ?></td>
            <td><?= $row['clicks'] ?></td>
            <td><?= $row['last_click'] ?></td>
        </tr>
    <?php endforeach; ?>
</table>

🔐 Consejos de seguridad

  • Usa htmlspecialchars() para mostrar datos.
  • Valida que los slugs o IDs existan.
  • Si quieres ocultar aún más la URL, usa códigos generados con uniqid() o UUIDs.
  • Limita quién puede crear enlaces.

✅ Ventajas de este sistema

  • Ocultas los enlaces reales (ideal para afiliados).
  • Tomas control total de las estadísticas.
  • Puedes integrarlo fácilmente con WordPress, Laravel o cualquier otro sistema.

🧪 Posibles mejoras futuras

  • Filtros por fecha.
  • Exportación de datos.
  • Geolocalización por IP.
  • Protección contra bots.
  • QR codes.

🏁 Conclusión

Tener tu propio sistema de redirección y estadísticas no solo te da control, sino que también protege tus campañas y te ofrece datos valiosos. Además, con unas pocas líneas de código y una base de datos sencilla, puedes montar una solución profesional y escalable.


¿Te gustó este tutorial? ¡Déjame tus preguntas en los comentarios o contáctame si quieres que te lo integre en tu sitio!

Deja un comentario