Files
whatsapp/debug_install.php
T
2025-11-18 20:26:36 -05:00

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>