269 lines
13 KiB
PHP
269 lines
13 KiB
PHP
<?php
|
|
/**
|
|
* Instalador de depuración para hosting compartido
|
|
* Diagnóstica problemas específicos de conexión y configuración
|
|
* Desarrollado por U-Site.app
|
|
* Fecha: 13 de noviembre de 2025
|
|
*/
|
|
|
|
error_reporting(E_ALL);
|
|
ini_set('display_errors', 1);
|
|
|
|
$step = $_GET['step'] ?? 'test';
|
|
$dbHost = $_POST['db_host'] ?? 'localhost';
|
|
$dbPort = $_POST['db_port'] ?? '3306';
|
|
$dbName = $_POST['db_name'] ?? '';
|
|
$dbUser = $_POST['db_user'] ?? '';
|
|
$dbPass = $_POST['db_pass'] ?? '';
|
|
|
|
?>
|
|
<!DOCTYPE html>
|
|
<html lang="es">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>🔍 Diagnóstico de Instalación</title>
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
|
|
<style>
|
|
.console-output {
|
|
background: #1e1e1e;
|
|
color: #00ff00;
|
|
border-radius: 10px;
|
|
font-family: 'Courier New', monospace;
|
|
font-size: 0.9rem;
|
|
max-height: 500px;
|
|
overflow-y: auto;
|
|
padding: 15px;
|
|
}
|
|
.success { color: #00ff00; }
|
|
.error { color: #ff4444; }
|
|
.warning { color: #ffaa00; }
|
|
.info { color: #00aaff; }
|
|
</style>
|
|
</head>
|
|
<body class="bg-dark text-light">
|
|
<div class="container mt-4">
|
|
<div class="row">
|
|
<div class="col-12">
|
|
<h2><i class="fas fa-bug me-2"></i>Diagnóstico de Instalación WhatsApp Bot</h2>
|
|
<p class="text-muted">Herramienta de depuración para identificar problemas</p>
|
|
</div>
|
|
</div>
|
|
|
|
<?php if ($step === 'test'): ?>
|
|
<!-- Formulario de prueba -->
|
|
<form method="POST" action="?step=debug">
|
|
<div class="row g-3">
|
|
<div class="col-md-6">
|
|
<label class="form-label">Host de BD</label>
|
|
<input type="text" class="form-control" name="db_host" value="<?= htmlspecialchars($dbHost) ?>" required>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<label class="form-label">Puerto</label>
|
|
<input type="text" class="form-control" name="db_port" value="<?= htmlspecialchars($dbPort) ?>" required>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<label class="form-label">Nombre de BD</label>
|
|
<input type="text" class="form-control" name="db_name" value="<?= htmlspecialchars($dbName) ?>" required>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<label class="form-label">Usuario de BD</label>
|
|
<input type="text" class="form-control" name="db_user" value="<?= htmlspecialchars($dbUser) ?>" required>
|
|
</div>
|
|
<div class="col-12">
|
|
<label class="form-label">Contraseña de BD</label>
|
|
<input type="password" class="form-control" name="db_pass" value="<?= htmlspecialchars($dbPass) ?>" required>
|
|
</div>
|
|
<div class="col-12">
|
|
<button type="submit" class="btn btn-primary">
|
|
<i class="fas fa-search me-2"></i>Ejecutar Diagnóstico
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
|
|
<?php elseif ($step === 'debug'): ?>
|
|
<!-- Ejecutar diagnóstico -->
|
|
<div class="console-output">
|
|
<div class="info">WhatsApp Bot - Diagnóstico de Instalación</div>
|
|
<div class="info">Fecha: <?= date('Y-m-d H:i:s') ?></div>
|
|
<div class="info">═══════════════════════════════════════════</div>
|
|
|
|
<?php
|
|
// Test 1: Verificar extensiones PHP
|
|
echo "<div class='info'>📋 Test 1: Verificando extensiones PHP...</div>";
|
|
$requiredExtensions = ['pdo', 'pdo_mysql', 'json', 'curl', 'mbstring'];
|
|
foreach ($requiredExtensions as $ext) {
|
|
if (extension_loaded($ext)) {
|
|
echo "<div class='success'>✅ Extensión '$ext': Disponible</div>";
|
|
} else {
|
|
echo "<div class='error'>❌ Extensión '$ext': NO disponible</div>";
|
|
}
|
|
}
|
|
|
|
// Test 2: Verificar archivos del sistema
|
|
echo "<div class='info'>📁 Test 2: Verificando archivos del sistema...</div>";
|
|
$requiredFiles = [
|
|
'config/config.php' => 'Configuración principal',
|
|
'classes/Database.php' => 'Clase Database',
|
|
'database/schema.sql' => 'Esquema de BD',
|
|
'api/webhook.php' => 'Webhook API'
|
|
];
|
|
foreach ($requiredFiles as $file => $desc) {
|
|
if (file_exists($file)) {
|
|
$size = filesize($file);
|
|
echo "<div class='success'>✅ $desc ($file): Existe ($size bytes)</div>";
|
|
} else {
|
|
echo "<div class='error'>❌ $desc ($file): NO existe</div>";
|
|
}
|
|
}
|
|
|
|
// Test 3: Probar conexión a servidor MySQL
|
|
echo "<div class='info'>🔌 Test 3: Probando conexión a servidor MySQL...</div>";
|
|
try {
|
|
$dsn = "mysql:host={$dbHost};port={$dbPort};charset=utf8mb4";
|
|
$pdo_test = new PDO($dsn, $dbUser, $dbPass, [
|
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
|
PDO::ATTR_TIMEOUT => 5,
|
|
]);
|
|
echo "<div class='success'>✅ Conexión al servidor MySQL: EXITOSA</div>";
|
|
|
|
// Obtener información del servidor
|
|
$version = $pdo_test->query("SELECT VERSION()")->fetchColumn();
|
|
echo "<div class='success'>✅ Versión MySQL: $version</div>";
|
|
|
|
} catch (PDOException $e) {
|
|
echo "<div class='error'>❌ Error de conexión: " . $e->getMessage() . "</div>";
|
|
echo "<div class='warning'>💡 Posibles causas:</div>";
|
|
echo "<div class='warning'> - Credenciales incorrectas</div>";
|
|
echo "<div class='warning'> - MySQL no está corriendo</div>";
|
|
echo "<div class='warning'> - Firewall bloqueando conexión</div>";
|
|
}
|
|
|
|
// Test 4: Verificar acceso a base de datos específica
|
|
echo "<div class='info'>💾 Test 4: Verificando acceso a base de datos '$dbName'...</div>";
|
|
try {
|
|
$dsn = "mysql:host={$dbHost};port={$dbPort};dbname={$dbName};charset=utf8mb4";
|
|
$pdo_db = new PDO($dsn, $dbUser, $dbPass, [
|
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
|
PDO::ATTR_TIMEOUT => 5,
|
|
]);
|
|
echo "<div class='success'>✅ Acceso a base de datos '$dbName': EXITOSO</div>";
|
|
|
|
// Verificar permisos
|
|
try {
|
|
$pdo_db->exec("CREATE TABLE test_permissions (id INT PRIMARY KEY)");
|
|
$pdo_db->exec("DROP TABLE test_permissions");
|
|
echo "<div class='success'>✅ Permisos CREATE/DROP: Disponibles</div>";
|
|
} catch (PDOException $e) {
|
|
echo "<div class='warning'>⚠️ Permisos limitados: " . $e->getMessage() . "</div>";
|
|
}
|
|
|
|
// Listar tablas existentes
|
|
$stmt = $pdo_db->query("SHOW TABLES");
|
|
$tables = $stmt->fetchAll(PDO::FETCH_COLUMN);
|
|
if (count($tables) > 0) {
|
|
echo "<div class='info'>📋 Tablas existentes (" . count($tables) . "):</div>";
|
|
foreach ($tables as $table) {
|
|
echo "<div class='info'> - $table</div>";
|
|
}
|
|
} else {
|
|
echo "<div class='warning'>⚠️ Base de datos vacía (sin tablas)</div>";
|
|
}
|
|
|
|
} catch (PDOException $e) {
|
|
echo "<div class='error'>❌ Error accediendo a BD '$dbName': " . $e->getMessage() . "</div>";
|
|
echo "<div class='warning'>💡 Posibles causas:</div>";
|
|
echo "<div class='warning'> - Base de datos no existe</div>";
|
|
echo "<div class='warning'> - Usuario sin permisos en esta BD</div>";
|
|
echo "<div class='warning'> - Nombre de BD incorrecto</div>";
|
|
}
|
|
|
|
// Test 5: Probar carga del archivo config.php
|
|
echo "<div class='info'>⚙️ Test 5: Probando carga de configuración...</div>";
|
|
try {
|
|
if (file_exists('config/config.php')) {
|
|
$configContent = file_get_contents('config/config.php');
|
|
|
|
// Verificar constantes principales
|
|
$constants = ['DB_HOST', 'DB_NAME', 'DB_USER', 'DB_PASS'];
|
|
foreach ($constants as $constant) {
|
|
if (strpos($configContent, $constant) !== false) {
|
|
echo "<div class='success'>✅ Constante '$constant': Definida en config</div>";
|
|
} else {
|
|
echo "<div class='error'>❌ Constante '$constant': NO encontrada</div>";
|
|
}
|
|
}
|
|
|
|
// Intentar incluir config (sin ejecutar)
|
|
echo "<div class='success'>✅ Archivo config.php: Legible</div>";
|
|
} else {
|
|
echo "<div class='error'>❌ Archivo config.php: NO existe</div>";
|
|
}
|
|
} catch (Exception $e) {
|
|
echo "<div class='error'>❌ Error leyendo config: " . $e->getMessage() . "</div>";
|
|
}
|
|
|
|
// Test 6: Verificar schema.sql
|
|
echo "<div class='info'>📄 Test 6: Verificando archivo schema.sql...</div>";
|
|
try {
|
|
if (file_exists('database/schema.sql')) {
|
|
$schema = file_get_contents('database/schema.sql');
|
|
$statements = explode(';', $schema);
|
|
$createTables = 0;
|
|
$insertData = 0;
|
|
|
|
foreach ($statements as $statement) {
|
|
if (preg_match('/CREATE TABLE/i', $statement)) $createTables++;
|
|
if (preg_match('/INSERT INTO/i', $statement)) $insertData++;
|
|
}
|
|
|
|
echo "<div class='success'>✅ Schema SQL: $createTables tablas, $insertData inserts</div>";
|
|
|
|
// Verificar tablas principales
|
|
$mainTables = ['users', 'conversations', 'menus', 'system_config'];
|
|
foreach ($mainTables as $table) {
|
|
if (strpos($schema, "CREATE TABLE $table") !== false) {
|
|
echo "<div class='success'>✅ Tabla '$table': Definida en schema</div>";
|
|
} else {
|
|
echo "<div class='warning'>⚠️ Tabla '$table': NO definida en schema</div>";
|
|
}
|
|
}
|
|
} else {
|
|
echo "<div class='error'>❌ Archivo schema.sql: NO existe</div>";
|
|
}
|
|
} catch (Exception $e) {
|
|
echo "<div class='error'>❌ Error leyendo schema: " . $e->getMessage() . "</div>";
|
|
}
|
|
|
|
echo "<div class='info'>═══════════════════════════════════════════</div>";
|
|
echo "<div class='info'>Diagnóstico completado: " . date('H:i:s') . "</div>";
|
|
?>
|
|
</div>
|
|
|
|
<div class="mt-4">
|
|
<h5>🚀 Acciones sugeridas:</h5>
|
|
<div class="row g-3">
|
|
<div class="col-md-4">
|
|
<a href="install_manual.php" class="btn btn-success w-100">
|
|
<i class="fas fa-tools me-2"></i>Instalar Manual
|
|
</a>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<a href="?step=test" class="btn btn-secondary w-100">
|
|
<i class="fas fa-redo me-2"></i>Ejecutar Otro Test
|
|
</a>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<a href="test.php" class="btn btn-info w-100">
|
|
<i class="fas fa-vial me-2"></i>Test Sistema
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<?php endif; ?>
|
|
</div>
|
|
</body>
|
|
</html>
|