check()) { // Send rate limit headers http_response_code(429); header('Retry-After: ' . $rateLimit->getResetTime()); $rateLimit->sendHeaders(); // Display error page include APP_ROOT . '/includes/header.php'; echo '
'; echo '
'; echo '
'; echo ' Trop de requêtes
'; echo ' Vous avez dépassé la limite de ' . 30 . ' recherches par minute.'; echo '
Veuillez réessayer dans ' . $rateLimit->getResetTime() . ' secondes.'; echo '
'; echo '
'; echo '
'; include APP_ROOT . '/includes/footer.php'; exit; } // Send rate limit headers for successful requests $rateLimit->sendHeaders(); // Periodic cleanup (1% chance) if (rand(1, 100) === 1) { $rateLimit->cleanup(); } // Pagination (max 100 per page) $page = isset($_GET['page']) ? intval($_GET['page']) : 1; $itemsPerPage = min(100, isset($_GET['per_page']) ? intval($_GET['per_page']) : 20); // Collect search parameters $searchParams = []; if (!empty($_GET['query'])) { $searchParams['query'] = trim($_GET['query']); } if (!empty($_GET['year'])) { $searchParams['year'] = intval($_GET['year']); } if (!empty($_GET['orientation'])) { $searchParams['orientation'] = $_GET['orientation']; } if (!empty($_GET['ap_program'])) { $searchParams['ap_program'] = $_GET['ap_program']; } if (!empty($_GET['finality'])) { $searchParams['finality'] = $_GET['finality']; } if (!empty($_GET['keyword'])) { $searchParams['keyword'] = $_GET['keyword']; } if (!empty($_GET['format'])) { $searchParams['format'] = $_GET['format']; } if (!empty($_GET['language'])) { $searchParams['language'] = $_GET['language']; } if (isset($_GET['is_doctoral'])) { $searchParams['is_doctoral'] = $_GET['is_doctoral'] === '1'; } $validationError = null; try { $db = Database::getInstance(); // Get search results $offset = ($page - 1) * $itemsPerPage; $results = $db->searchTheses($searchParams, $itemsPerPage, $offset); $totalItems = $db->countSearchResults($searchParams); $totalPages = ceil($totalItems / $itemsPerPage); // Get filter options $years = $db->getAvailableYears(); $orientations = $db->getOrientations(); $apPrograms = $db->getApPrograms(); $finalityTypes = $db->getFinalityTypes(); $keywords = $db->getUsedKeywords(); $formats = $db->getFormatTypes(); $languages = $db->getLanguages(); } catch (InvalidArgumentException $e) { // Input validation error error_log("Search validation error: " . $e->getMessage()); $validationError = $e->getMessage(); $results = []; $totalPages = 0; $totalItems = 0; $years = []; $orientations = []; $apPrograms = []; $finalityTypes = []; $keywords = []; $formats = []; $languages = []; } catch (Exception $e) { // Database or other error error_log("Error in search: " . $e->getMessage()); $validationError = "Une erreur est survenue lors de la recherche."; $results = []; $totalPages = 0; $totalItems = 0; $years = []; $orientations = []; $apPrograms = []; $finalityTypes = []; $keywords = []; $formats = []; $languages = []; } include APP_ROOT . '/includes/header.php'; ?>

Rechercher un mémoire

Erreur de validation :

Recherche dans le titre, sous-titre, synopsis, auteurs, promoteurs et mots-clés

résultat 1 ? 's' : ''; ?> trouvé 1 ? 's' : ''; ?>
0): ?> 1): ?>
Utilisez le formulaire ci-dessus pour rechercher des mémoires.