false, 'message' => 'Método no permitido']); exit(); } $input = json_decode(file_get_contents('php://input'), true); if (!isset($input['secret_key']) || $input['secret_key'] !== SECRET_KEY) { http_response_code(401); echo json_encode(['success' => false, 'message' => 'Clave secreta inválida']); exit(); } require_once 'conexion.php'; $tabla = $input['tabla'] ?? ''; $datos = $input['datos'] ?? []; $tablas_permitidas = ['reservas', 'multas', 'usuarios', 'mascotas', 'cabinas', 'telemetria', 'historial_accesos']; if (!in_array($tabla, $tablas_permitidas)) { http_response_code(400); echo json_encode(['success' => false, 'message' => 'Tabla no permitida']); exit(); } if (empty($datos)) { echo json_encode(['success' => true, 'message' => 'Sin datos para sincronizar', 'actualizados' => 0]); exit(); } try { $pdo->beginTransaction(); // 🔑 Desactivar temporalmente las FK checks (seguridad adicional) $pdo->exec('SET FOREIGN_KEY_CHECKS = 0'); $actualizados = 0; foreach ($datos as $fila) { $columnas = array_keys($fila); $placeholders = array_fill(0, count($columnas), '?'); $valores = array_values($fila); // Construir la parte UPDATE: columna=VALUES(columna) $updatePart = []; foreach ($columnas as $col) { $updatePart[] = "$col = VALUES($col)"; } // INSERT ... ON DUPLICATE KEY UPDATE $sql = "INSERT INTO $tabla (" . implode(',', $columnas) . ") VALUES (" . implode(',', $placeholders) . ") ON DUPLICATE KEY UPDATE " . implode(',', $updatePart); $stmt = $pdo->prepare($sql); $stmt->execute($valores); $actualizados++; } // 🔑 Reactivar FK checks $pdo->exec('SET FOREIGN_KEY_CHECKS = 1'); $pdo->commit(); echo json_encode([ 'success' => true, 'message' => "Sincronización de '$tabla' completada", 'actualizados' => $actualizados ]); } catch (PDOException $e) { $pdo->exec('SET FOREIGN_KEY_CHECKS = 1'); $pdo->rollBack(); http_response_code(500); echo json_encode([ 'success' => false, 'message' => 'Error en base de datos', 'error' => $e->getMessage() ]); } ?>