diff --git a/app/controllers/my_courses.php b/app/controllers/my_courses.php
index 82e97b5f7444f5bde4179b7a93d05ab660f52475..fc5c2e766f0420c3b73c3c25e31d90843aa44775 100644
--- a/app/controllers/my_courses.php
+++ b/app/controllers/my_courses.php
@@ -805,12 +805,8 @@ class MyCoursesController extends AuthenticatedController
 
         $widget = new SelectWidget(_('Semesterfilter'), $this->url_for('my_courses/set_semester'), 'sem_select');
         $widget->setMaxLength(50);
-        $widget->addElement(new SelectElement('current', _('Aktuelles Semester'), $sem == 'current'));
-        $widget->addElement(new SelectElement('future', _('Aktuelles und nächstes Semester'), $sem == 'future'));
-        $widget->addElement(new SelectElement('last', _('Aktuelles und letztes Semester'), $sem == 'last'));
-        $widget->addElement(new SelectElement('lastandnext', _('Letztes, aktuelles, nächstes Semester'), $sem == 'lastandnext'));
-        if (Config::get()->MY_COURSES_ENABLE_ALL_SEMESTERS) {
-            $widget->addElement(new SelectElement('all', _('Alle Semester'), $sem == 'all'));
+        foreach ($this->getTextualSemesterEntries() as $key => $label) {
+            $widget->addElement(new SelectElement($key, $label, $sem === $key));
         }
 
         $query = "SELECT semester_data.semester_id
@@ -848,7 +844,7 @@ class MyCoursesController extends AuthenticatedController
         }
 
         // create settings url depended on selected cycle
-        if (isset($sem) && !in_array($sem, words('future all last current'))) {
+        if (isset($sem) && !$this->isValidTextualSemesterEntry($sem)) {
             $this->settings_url = "dispatch.php/my_courses/groups/{$sem}";
         } else {
             $this->settings_url = 'dispatch.php/my_courses/groups';
@@ -1076,12 +1072,21 @@ class MyCoursesController extends AuthenticatedController
             $config_sem = 'future';
         }
 
+        if (
+            $config_sem
+            && !$this->isValidTextualSemesterEntry($config_sem)
+            && !Semester::exists($config_sem)
+        ) {
+            $config_sem = null;
+        }
+
         $sem = Request::get(
             'sem_select',
             $config_sem ?: Config::get()->MY_COURSES_DEFAULT_CYCLE
         );
 
-        if ($sem && !in_array($sem, ['future', 'all', 'last', 'current'])) {
+
+        if ($sem && !$this->isValidTextualSemesterEntry($sem)) {
             Request::set('sem_select', $sem);
         }
 
@@ -1110,4 +1115,36 @@ class MyCoursesController extends AuthenticatedController
 
         return $group_field === 'not_grouped' ? 'sem_number' : $group_field;
     }
+
+    /**
+     * Returns all valid textual semester entries like 'last', 'future' etc
+     *
+     * @return array<string, string>
+     */
+    private function getTextualSemesterEntries(): array
+    {
+        $entries = [
+            'current'     => _('Aktuelles Semester'),
+            'future'      => _('Aktuelles und nächstes Semester'),
+            'last'        => _('Aktuelles und letztes Semester'),
+            'lastandnext' => _('Letztes, aktuelles, nächstes Semester'),
+        ];
+
+        if (Config::get()->MY_COURSES_ENABLE_ALL_SEMESTERS) {
+            $entries['all'] = _('Alle Semester');
+        }
+
+        return $entries;
+    }
+
+    /**
+     * Returns whether the given entry is a valid textual semester entry.
+     *
+     * @see getTextualSemesterEntries()
+     * @return bool
+     */
+    private function isValidTextualSemesterEntry(string $entry): bool
+    {
+        return array_key_exists($entry, $this->getTextualSemesterEntries());
+    }
 }
diff --git a/lib/classes/MyRealmModel.php b/lib/classes/MyRealmModel.php
index a68a0c1ac5ff6b2055fdfe894cff1f606aeab738..a295b3f8865bc946b90849cc0fa58309dfc617bc 100644
--- a/lib/classes/MyRealmModel.php
+++ b/lib/classes/MyRealmModel.php
@@ -169,12 +169,15 @@ class MyRealmModel
 
         $sem_data = Semester::getAllAsArray();
 
-        $semester_ids      = [];
-        for ($i = $min_sem_key; $i <= $max_sem_key; $i++) {
-            if ($sem_data[$i]['semester_id']) {
-                $semester_ids[] = $sem_data[$i]['semester_id'];
+        $semester_ids = [];
+        if (is_numeric($min_sem_key) && is_numeric($max_sem_key)) {
+            foreach ($sem_data as $index => $data) {
+                if ($index >= $min_sem_key && $index <= $max_sem_key) {
+                    $semester_ids[] = $data['semester_id'];
+                }
             }
         }
+
         $semesters = Semester::findMany($semester_ids);
         $studygroup_filter = !$params['studygroups_enabled'] ? false : true;
         $ordering          = '';