V podstatě nemůžete vytisknout soubor CSV a odkaz na něj najednou. (Musíte zavést koncept „režimu“ stránky a aktivovat režim stahování pomocí ...pagename.php?mode=download nebo podobně. Potom můžete použít příkaz PHP switch k zapnutí $_GET['mode'] ve vašem skriptu.)
To znamená, že záhlaví typu obsahu text/csv, které jste používali, je správné, i když možná budete chtít vytisknout také záhlaví Content-Length a Content-Disposition. Poté, co odešlete data souboru, také nezapomeňte zastavit jakékoli další zpracování skriptu pomocí exit
PHP funkce.
Kromě toho by pravděpodobně bylo mnohem méně obtíží (a určitě bude rychlejší/úspornější z hlediska paměti) používat MySQL VYBRAT... DO OUTFILE zařízení (pokud máte oprávnění) místo použití PHP ke shromažďování dat.