query("SELECT id FROM operations"); $migratedOperations = $stmt->fetchAll(PDO::FETCH_COLUMN); if (empty($migratedOperations)) { echo "Aucune opération n'a été migrée. Veuillez d'abord migrer la table operations." . PHP_EOL; closeSshTunnel(); exit(1); } echo "Nombre d'opérations migrées : " . count($migratedOperations) . PHP_EOL; // Récupération des IDs des utilisateurs qui ont été migrés $stmt = $targetDb->query("SELECT id FROM users"); $migratedUsers = $stmt->fetchAll(PDO::FETCH_COLUMN); if (empty($migratedUsers)) { echo "Aucun utilisateur n'a été migré. Veuillez d'abord migrer la table users." . PHP_EOL; closeSshTunnel(); exit(1); } echo "Nombre d'utilisateurs migrés : " . count($migratedUsers) . PHP_EOL; // Récupération de la correspondance entre les anciens secteurs et les nouveaux $stmt = $targetDb->query("SELECT id, fk_operation, fk_old_sector FROM ope_sectors"); $sectorMapping = $stmt->fetchAll(PDO::FETCH_ASSOC); if (empty($sectorMapping)) { echo "Aucun secteur n'a été migré. Veuillez d'abord migrer la table ope_sectors." . PHP_EOL; closeSshTunnel(); exit(1); } echo "Nombre de secteurs migrés : " . count($sectorMapping) . PHP_EOL; // Création d'un tableau associatif pour faciliter la recherche des correspondances $sectorMap = []; foreach ($sectorMapping as $mapping) { $key = $mapping['fk_operation'] . '_' . $mapping['fk_old_sector']; $sectorMap[$key] = $mapping['id']; } // Création de la liste des IDs d'opérations pour la requête IN $operationIds = implode(',', $migratedOperations); // Création de la liste des IDs d'utilisateurs pour la requête IN $userIds = implode(',', $migratedUsers); // Récupération des associations utilisateurs-secteurs depuis la base source $query = " SELECT * FROM ope_users_sectors WHERE fk_operation IN ($operationIds) AND fk_user IN ($userIds) AND active = 1 "; $stmt = $sourceDb->query($query); $userSectors = $stmt->fetchAll(PDO::FETCH_ASSOC); echo "Nombre d'associations utilisateurs-secteurs à migrer : " . count($userSectors) . PHP_EOL; // Préparation de la requête d'insertion $insertQuery = "INSERT INTO ope_users_sectors ( fk_operation, fk_user, fk_sector, created_at, fk_user_creat, updated_at, fk_user_modif, chk_active ) VALUES ( :fk_operation, :fk_user, :fk_sector, :created_at, :fk_user_creat, :updated_at, :fk_user_modif, :chk_active ) ON DUPLICATE KEY UPDATE updated_at = VALUES(updated_at), fk_user_modif = VALUES(fk_user_modif), chk_active = VALUES(chk_active)"; $insertStmt = $targetDb->prepare($insertQuery); // Compteurs $inserted = 0; $skipped = 0; $errors = 0; // Traitement de chaque association utilisateur-secteur foreach ($userSectors as $userSector) { $fkOperation = $userSector['fk_operation']; $fkUser = $userSector['fk_user']; $fkOldSector = $userSector['fk_sector']; // Recherche du nouvel ID de secteur $key = $fkOperation . '_' . $fkOldSector; if (!isset($sectorMap[$key])) { echo "Secteur non trouvé pour l'opération $fkOperation et le secteur $fkOldSector. Association ignorée.\n"; $skipped++; continue; } $fkNewSector = $sectorMap[$key]; // Préparation des données pour l'insertion $userSectorData = [ 'fk_operation' => $fkOperation, 'fk_user' => $fkUser, 'fk_sector' => $fkNewSector, 'created_at' => date('Y-m-d H:i:s'), 'fk_user_creat' => 1, // Utilisateur par défaut 'updated_at' => date('Y-m-d H:i:s'), 'fk_user_modif' => 1, // Utilisateur par défaut 'chk_active' => 1 ]; try { // Insertion dans la table cible $insertStmt->execute($userSectorData); $inserted++; // Affichage du progrès if ($inserted % 100 === 0) { echo "Progression : $inserted associations utilisateurs-secteurs migrées...\n"; } } catch (PDOException $e) { echo "Erreur lors de la migration de l'association utilisateur-secteur (opération $fkOperation, utilisateur $fkUser, secteur $fkOldSector) : " . $e->getMessage() . "\n"; $errors++; } } echo "Migration terminée. $inserted associations utilisateurs-secteurs migrées avec succès, $skipped ignorées. $errors erreurs rencontrées." . PHP_EOL; // Fermer le tunnel SSH closeSshTunnel(); } catch (Exception $e) { echo "Erreur critique: " . $e->getMessage() . PHP_EOL; // Fermer le tunnel SSH en cas d'erreur closeSshTunnel(); exit(1); }