En esencia, no puede generar el archivo CSV y el enlace al mismo de una sola vez. (Debe introducir el concepto de un "modo" de página y activar el modo de descarga a través de ...pagename.php?mode=download o similar. Luego puede usar la declaración de cambio de PHP para activar $_GET['mode'] en su guión.)
Dicho esto, el encabezado de tipo de contenido de texto/csv que estaba usando es correcto, aunque es posible que también desee generar los encabezados Content-Length y Content-Disposition. Una vez que haya generado los datos del archivo, también asegúrese de detener cualquier procesamiento de script adicional a través de exit
de PHP. función.
Además, probablemente sería mucho menos complicado (y sin duda será más rápido/más eficiente en memoria) usar MySQL SELECCIONAR... EN PERFIL instalación (si tiene los permisos) en lugar de usar PHP para recopilar los datos.