Originariamente inviato da the be$t
I cookie, vanno attivati prima di qualsiasi output, anche una riga vuota è considerata come output.
Quindi tutti i vari setcookie('nome', 'valore'); vanno inseriti all'inizio del file.
http://it.php.net/manual/it/function.setcookie.php
nel codice che ha postato non sembra ci siano echo, print o funzioni che inviino qualcosa al browser, a parte eventuali spazi vuoti che, se ci sono, non penso abbia incollato qui
il problema potrebbe essere, per lo più, dovuto al fatto che il tempo limite del cookie è stato impostato a 30 secondi dall'accesso della pagina!
Inoltre, il codice postato invia il cookie, si, ma non verifica se questo è presente per effettuare l'inserimento 
codice:
<?php
// Avvia la sessione (l'ho lasciato ma con i cookie non ha nulla a che fare)
session_start();
// Si connette al database MySQL
mysql_connect("localhost", "nomeutente", "password");
mysql_select_db("nomedatabase");
// Costruisce il nome del cookie convertendo tutti i caratteri che non sono lettere, numeri, punti, underscore e dash in dash
$cookieName = '__visited_pages#' . strtolower(preg_replace('/([^A-Z0-9-]+)/i', '-', $_SERVER['PHP_SELF']));
// Imposta, a prescindere, un cookie per identificare l'accesso alla pagina corrente, impostando la scadenza
// su un anno dal momento del settaggio del cookie in modo che la scadenza sia sempre prolungata
setcookie($cookieName, $_SERVER['PHP_SELF'], time() + (60 * 60 * 24 * 365), '/');
// Acquisisce il numero di visite
$query = mysql_unbuffered_query("SELECT visite FROM contatore WHERE pagina = '" . mysql_reale_escape_string($_SERVER['PHP_SELF']) . "'") or die(mysql_error());
while($row = mysql_fetch_row($query))
{
$visite = $row[0];
}
mysql_free_result($query);
if (isset($visite) === false)
{
$visite = 0;
}
// Verifica se il cookie è settato ovvero se la pagina è stata già visitata
if (isset($_COOKIE[$cookieName]) === false)
{
// Incrementa il contatore delle visite
$visite++;
// Aggiorna il database
$res = mysql_query("INSERT INTO contatore (visite, pagina) VALUES ({$visite}, '" . mysql_reale_escape_string($_SERVER['PHP_SELF']) . "') ON DUPLICATE KEY UPDATE visite = {$visite};") or die(mysql_error());
}
echo "La pagina è stata visitata {$visite} volte
";
?>
In parole semplici lo script fa partire la sessione e si connette al database, ho spostato questo codice all'inizio perché se non va lui non deve fare altro. Dopo di che costruisce il nome del cookie usando un prefisso, in questo caso __visited_pages# e poi una versione "ripulita" del percorso web della pagina richiesta, ovvero tutto quello che non sono lettere, numeri e trattini viene convertito in trattini.
Una volta fatto questo setta il cookie a prescindere dal fatto che c'è già o meno, cosi da aggiornare la data della scadenza, dopo di che estrae il numero di visite effettuate a quella pagina e verifica se il cookie è presente o meno in modo che se non è presente incrementa il valore e lo setta usando il replace
Fatto il tutto visualizza il numero di visite alla pagina.
Usando questo sistema non hai bisogno di inserire manualmente tutte le pagine nella tabella del database, le inserisce da solo, tu devi semplicemente impostare il campo pagina come chiave primary key di tipo varchar(255)!
Quando fa l'estrazione non imposta direttamente il valore bensì usa il while in modo da estrarre il valore se c'è, mentre se non c'è non setta la variabile che viene sistemata subito dopo nell'if isset
Qui ti posto qualche link
http://www.php.net/mysql_unbuffered_query
http://www.php.net/mysql_real_escape_string
http://www.php.net/mysql_fetch_row
http://www.php.net/mysql_free_result
http://www.php.net/preg_replace
http://www.php.net/strtolower
http://www.php.net/isset
Riguardo all'insert speciale
http://dev.mysql.com/doc/refman/5.0/...duplicate.html