82 lines
3.1 KiB
PHP
82 lines
3.1 KiB
PHP
<?php
|
|
/**
|
|
* Ejecuta la migración del sistema de Roles y Módulos.
|
|
* Acceder UNA sola vez desde el navegador (admin autenticado).
|
|
* Eliminar o proteger este archivo después de ejecutar.
|
|
*/
|
|
require_once 'config/config.php';
|
|
|
|
if (!isUserLoggedIn()) {
|
|
header('Location: login.php'); exit;
|
|
}
|
|
|
|
$sqlFile = __DIR__ . '/migrations/20260304_roles_and_modules.sql';
|
|
if (!file_exists($sqlFile)) {
|
|
die('❌ Archivo de migración no encontrado: ' . $sqlFile);
|
|
}
|
|
|
|
$sql = file_get_contents($sqlFile);
|
|
|
|
// Eliminar comentarios de línea (-- ...) y comentarios de bloque (/* ... */)
|
|
$sql = preg_replace('/--[^\n]*/', '', $sql);
|
|
$sql = preg_replace('/\/\*.*?\*\//s', '', $sql);
|
|
|
|
// Dividir en sentencias individuales por el punto y coma
|
|
$statements = array_filter(
|
|
array_map('trim', explode(';', $sql)),
|
|
fn($s) => $s !== '' && $s !== "\n"
|
|
);
|
|
|
|
try {
|
|
$pdo = createDbConnection();
|
|
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|
|
|
$ok = 0; $errors = [];
|
|
foreach ($statements as $stmt) {
|
|
if (!trim($stmt)) continue;
|
|
try {
|
|
$pdo->exec($stmt);
|
|
$ok++;
|
|
} catch (PDOException $e) {
|
|
// Ignorar: columna ya existe, índice ya existe, clave duplicada en INSERT
|
|
$msg = $e->getMessage();
|
|
if (
|
|
str_contains($msg, 'Duplicate entry') ||
|
|
str_contains($msg, 'Duplicate key') ||
|
|
str_contains($msg, 'already exists') ||
|
|
str_contains($msg, 'Duplicate column name') ||
|
|
str_contains($msg, "Can't DROP") ||
|
|
preg_match('/already exists/i', $msg)
|
|
) {
|
|
$ok++;
|
|
} else {
|
|
$errors[] = '<strong>Error:</strong> ' . htmlspecialchars($msg) .
|
|
'<br><code>' . htmlspecialchars(substr($stmt, 0, 200)) . '</code>';
|
|
}
|
|
}
|
|
}
|
|
?>
|
|
<!DOCTYPE html><html lang="es"><head><meta charset="UTF-8">
|
|
<title>Migración Roles</title>
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
</head><body class="p-4">
|
|
<div class="container" style="max-width:740px">
|
|
<h3 class="mb-3">🔧 Migración: Roles y Módulos</h3>
|
|
<div class="alert alert-<?= $errors ? 'warning' : 'success' ?>">
|
|
✅ <strong><?= $ok ?></strong> sentencias ejecutadas correctamente.<br>
|
|
<?php if ($errors): ?>
|
|
⚠️ <strong><?= count($errors) ?></strong> advertencias (ver abajo).
|
|
<?php endif; ?>
|
|
</div>
|
|
<?php foreach ($errors as $e): ?>
|
|
<div class="alert alert-danger small"><?= $e ?></div>
|
|
<?php endforeach; ?>
|
|
<a href="lab_usuarios.php" class="btn btn-primary">Ir a Usuarios & Roles →</a>
|
|
<a href="lab_dashboard.php" class="btn btn-outline-secondary ms-2">Dashboard</a>
|
|
<p class="mt-3 text-muted small">⚠️ Elimina o protege este archivo (<code>run_roles_migration.php</code>) después de ejecutarlo.</p>
|
|
</div></body></html>
|
|
<?php
|
|
} catch (Exception $e) {
|
|
echo '<div class="alert alert-danger p-3">❌ Error de conexión: ' . htmlspecialchars($e->getMessage()) . '</div>';
|
|
}
|