Spiegazione breve: usa ob_start() all'inizio del file

http://php.net/manual/en/function.ob-start.php


Spiegazione lunga: un cookie non è altro che una stringa facente parte dell'header del pacchetto HTTP (un pacchetto HTTP è formato da header + body http://en.wikipedia.org/wiki/Hyperte...nsfer_Protocol ), se quindi provi a impostare un cookie dopo che è stato già generato dell'output con print o echo, PHP non sa cosa farsene di quel cookie che vuoi impostare e genera l'errore.

Con ob_start() php esegue il buffering dell'output che viene inviato al client solamente alla fine dell'esecuzione dello script o per esecuzioni di funzioni che forzano la fine del buffering e il 'rilascio' del contenuto fino ad allora bufferizzato. In questo modo puoi modificare l'header del risposta http anche dopo aver eseguito print o echo perchè tanto php non ha ancora scritto nulla nel body della risposta http.