/sync/ ├── config/ │ └── config.php # Tu configuración (host, user, suffix, etc.) ├── vendor/ │ └── utils_php/ut_DbPDO.class.php # (tu clase util) ├── sync.php # UI principal (lista diferencias, botones) ├── helpers.php # Funciones comunes: backupTable, addField, dropField, │ # cleanupBackups, syncIndexes, dropIndexesWithField, ... ├── ajax_update_db.php # Endpoint principal: add | drop | repair (campos + sincroniza índices) ├── ajax_add_table.php # Crear tabla en cliente (vacía o con datos) + sincroniza índices ├── ajax_cleanup_backups.php # Borra tablas *_backup_* en la BD del cliente ├── ajax_delete_field.php # (opcional/legacy) endpoint para eliminar campo (si lo mantienes) ├── ajax_update_index.php # (opcional/legacy) endpoint para índices — hoy no necesario porque lo integra ajax_update_db.php └── assets/ (opcional) └── js/ # scripts JS si quieres separar el código cliente DEPENDENCIAS sync.php (UI) ├─> ajax_update_db.php (add | drop | repair) ├─> ajax_add_table.php (create table empty / with data) └─> ajax_cleanup_backups.php (cleanup) ajax_update_db.php └─> helpers.php ├─ backupTable() ├─ addField() ├─ dropField() ├─ syncIndexes() ├─ dropIndexesWithField() └─ cleanupBackups() (si fuera necesario) ajax_add_table.php └─> helpers.php └─ syncIndexes() (usado al final para asegurar índices) ajax_cleanup_backups.php └─> helpers.php └─ cleanupBackups() diagrama de flujo simplificado del nuevo ajax_update_db.php: ┌───────────────────────────┐ │ ajax_update_db.php │ └────────────┬──────────────┘ │ Recibe parámetros (db, table, data, lastfield, action) │ ┌────────────▼─────────────┐ │ ¿Faltan parámetros? │ └───────┬─────────┬────────┘ │NO │SÍ │ │ │ ┌─────▼──────┐ │ │ Error JSON │ │ └────────────┘ │ ┌─────────────▼─────────────┐ │ Conectar a la BD cliente │ └─────────────┬─────────────┘ │ ┌─────────────▼─────────────┐ │ Backup de la tabla │ │ (CREATE TABLE ... AS ...)│ └─────────────┬─────────────┘ │ ┌─────────▼──────────┐ │ switch(action) │ └───────┬─┬─┬────────┘ │ │ │ ┌─────────┘ │ └─────────┐ ▼ ▼ ▼ ┌────────────┐┌───────────┐┌─────────────┐ │ addField() ││dropField()││repairField()│ └─────┬──────┘└────┬──────┘└──────┬──────┘ │ │ │ └────────────┴──────────────┘ │ ┌─────────────▼─────────────┐ │ Respuesta JSON │ │ {status: ok/error, │ │ message: "..."} │ └───────────────────────────┘ 🔎 En palabras: Valida parámetros. Conecta al MySQL del cliente. Hace backup de la tabla antes de tocarla. Según la acción (add, drop, repair): ejecuta la función correspondiente. Devuelve JSON con el resultado. diagrama de cómo ajax_update_db.php se relaciona con helpers.php ┌──────────────────────────────┐ │ sync.php │ │ (Interfaz con botones) │ └───────────────┬──────────────┘ │ AJAX call ▼ ┌──────────────────────────────┐ │ ajax_update_db.php │ │ - Recibe acción (add/drop/repair) │ - Conecta a BD cliente │ - Hace backup de la tabla │ - Llama funciones helpers │ └───────────────┬──────────────┘ │ ▼ ┌──────────────────────────────┐ │ helpers.php │ │ │ │ backupTable() ← usado siempre │ addField() ← para "add" │ dropField() ← para "drop" │ repairField() ← para "repair" │ syncIndexes() ← usado dentro de repair │ cleanupBackups() (manual) │ └──────────────────────────────┘ 🔎 Explicación rápida: sync.php → genera la vista con botones (Agregar, Eliminar, Reparar). Al hacer clic → se llama vía AJAX a ajax_update_db.php. ajax_update_db.php → interpreta la acción, hace un backup y llama la función correspondiente de helpers.php. helpers.php → contiene toda la lógica real de modificación de tablas/índices. De esta forma: 👉 ajax_update_db.php es el puente entre tu frontend (sync.php) y las funciones de base de datos (helpers.php). mapa de botones de sync.php → acciones en ajax_update_db.php: ┌───────────────────────────────┐ │ sync.php │ │ (Genera botones en la UI) │ └──────────────┬────────────────┘ │ │ AJAX GET con parámetros: │ db, table, data, lastfield, action ▼ ┌────────────────────────────────────┐ │ ajax_update_db.php │ │ Recibe el parámetro "action" │ └──────────────┬─────────────────────┘ │ │ ┌────────┴───────────┐ ▼ ▼ ┌─────────────┐ ┌─────────────┐ │ Botón UI │ │ Acción │ └─────────────┘ └─────────────┘ Add field ─────────▶ action=add Drop field ─────────▶ action=drop Repair ─────────▶ action=repair Mapeo botón → endpoint → funciones (sync.php → back-end) Botón "Reparar" (en sync.php) → ajax_update_db.php?action=repair&db=...&table=...&data=...&lastfield=... → flujo: 1) backupTable() 2) repairField logic (remove indices if needed) -> dropIndexesWithField() 3) ALTER TABLE ... MODIFY (o add) 4) syncIndexes() // compara SHOW INDEX modelo vs cliente y crea/recrea índices faltantes 5) devuelve mensajes con lo que hizo Botón "Agregar campo" → ajax_update_db.php?action=add → flujo: 1) backupTable() 2) addField() 3) syncIndexes() // opcional según si quieres que añada índices nuevos Botón "Eliminar campo" → ajax_update_db.php?action=drop (o ajax_delete_field.php si usas endpoint separado) → flujo: 1) backupTable() 2) dropField() 3) dropIndexesWithField() // elimina índices que referencien ese campo Botón "Adicionar tabla (vacía / con datos)" → ajax_add_table.php?table=...&dbFinal=...&dbClient=...&withData=0|1 → flujo: 1) obtiene SHOW CREATE TABLE de dbFinal 2) crea tabla en cliente (igual estructura: columnas, AUTO_INCREMENT, índices) 3) si withData=1 → INSERT INTO cliente SELECT * FROM final 4) syncIndexes() // (precaución: generalmente no hace falta, CREATE TABLE ya trae índices) Botón "🗑 Borrar backups" → ajax_cleanup_backups.php?db=... → cleanupBackups()