O problema é que no topo da página você inicia a saída html independente se o usuário quer ver os arquivos a serem baixados, ou quer baixar o próprio arquivo. Nesse momento o arquivo a ser baixado se torna uma página html.
Seu código deve começar com uma verificação se o parâmetro id está definido. Se não, então você começa a gerar a página html. Se sim, você lê o arquivo do banco de dados, define os cabeçalhos e envia o conteúdo de volta.
Ou apenas use uma página php diferente para exibir a lista de arquivos e baixar um dos arquivos.