* @author Christian Fasanando */ exit; //remove this line to execute from the command line use ChamiloSession as Session; ini_set('memory_limit', '256M'); if (PHP_SAPI !== 'cli') { die('This script can only be executed from the command line'); } require_once __DIR__.'/../../main/inc/global.inc.php'; $debug = true; $_user['user_id'] = 1; Session::write('_user', $_user); echo "[" . time() . "] Querying courses\n"; $sql = "SELECT id, code FROM course ORDER BY id"; $resCourse = Database::query($sql); if ($resCourse === false) { exit("Could not find any course\n"); } $countCourses = Database::num_rows($resCourse); echo "[" . time() . "] Found $countCourses courses\n"; $duplicatesCount = 0; $originalsCount = 0; $deletedCount = 0; $itemsInLP = 0; // Iterate through each course while ($course = Database::fetch_assoc($resCourse)) { if (empty($course['id'])) { continue; // Skip invalid course IDs } if ($debug) { echo "\n-= Course ".$course['id']." (".$course['code'].") =-\n----\n"; } $sql2 = "SELECT iid, url, title, description, category_id, on_homepage, target, session_id FROM c_link WHERE c_id = " . $course['id'] . " AND (session_id = 0 OR session_id IS NULL) ORDER BY url, title, iid"; $res2 = Database::query($sql2); if ($res2 === false) { die("Error querying links in course code " . $course['code'] . "\n"); } $links = []; while ($item = Database::fetch_assoc($res2)) { $links[] = $item; } // Track processed duplicates to avoid redundant operations $processedDuplicates = []; foreach ($links as $key => $original) { $originalsCount++; // Make sure we don't use a just-deleted link as original if (in_array($original['iid'], $processedDuplicates)) { continue; } foreach ($links as $key2 => $duplicate) { if ($debug) { echo "Checking potential duplicate link ".$duplicate['iid']." against original ".$original['iid']."\n"; } if ( $key !== $key2 && !in_array($duplicate['iid'], $processedDuplicates) && $original['url'] === $duplicate['url'] && $original['title'] === $duplicate['title'] && $original['description'] === $duplicate['description'] && $original['category_id'] === $duplicate['category_id'] && $original['on_homepage'] === $duplicate['on_homepage'] && $original['target'] === $duplicate['target'] && $original['session_id'] === $duplicate['session_id'] && $original['iid'] < $duplicate['iid'] ) { $duplicatesCount++; if ($debug) { echo "\n[".date('Y-m-d h:i:s')."]\nDuplicate found in Course ID: " . $course['id'] . "\n"; echo "Original IID=" . $original['iid'] . ", Duplicate IID=" . $duplicate['iid'] . " ($duplicatesCount)\n"; } // Check if duplicate exists in c_lp_item $checkSql = "SELECT COUNT(*) as count FROM c_lp_item WHERE ref = " . $duplicate['iid'] . " AND c_id = " . $course['id'] . " AND item_type = 'link'"; $checkResult = Database::query($checkSql); $row = Database::fetch_assoc($checkResult); if ($row['count'] > 0) { $itemsInLP++; if ($debug) { echo "Duplicate in learning path: IID=" . $duplicate['iid'] . " (Original IID=" . $original['iid'] . ")\n"; } continue; // Skip duplicates in learning paths } // Delete the duplicate Link::deletelinkcategory($duplicate['iid'], 'link', $course['id'], true); $deletedCount++; $processedDuplicates[] = $duplicate['iid']; // Mark as processed if ($debug) { echo "Deleted Duplicate IID=" . $duplicate['iid'] . "\n"; } } } } if ($debug) { echo "Ending course ".$course['id']."\n\n"; } } // Summary if ($debug) { echo "\nSummary:\n"; echo "- Total duplicates detected: $duplicatesCount\n"; echo "- Duplicates ignored (in learning paths): $itemsInLP\n"; echo "- Duplicates deleted: $deletedCount\n"; echo "[".time()."] Process complete.\n"; }