Das Problem ist, dass Sie oben auf der Seite die HTML-Ausgabe starten, unabhängig davon, ob der Benutzer die herunterzuladenden Dateien sehen oder die Datei selbst herunterladen möchte. In diesem Moment wird die herunterzuladende Datei zu einer HTML-Seite.
Ihr Code sollte mit einer Überprüfung beginnen, ob der Parameter id gesetzt ist. Wenn nicht, beginnen Sie mit der Generierung der HTML-Seite. Wenn ja, dann liest du die Datei aus der DB, setzt die Header und schickst den Inhalt zurück.
Oder verwenden Sie einfach eine andere PHP-Seite, um die Liste der Dateien anzuzeigen und eine der Dateien herunterzuladen.