El problema es que en la parte superior de la página se inicia la salida html independientemente de si el usuario quiere ver los archivos que se van a descargar o si quiere descargar el archivo en sí. En ese momento el archivo a descargar se convierte en una página html.
Su código debe comenzar con una verificación si el parámetro id está configurado. Si no, comienza a generar la página html. En caso afirmativo, lea el archivo de la base de datos, establezca los encabezados y envíe el contenido de vuelta.
O simplemente use una página php diferente para mostrar la lista de archivos y descargar uno de los archivos.