Questo:
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, 'SET NAMES utf8');
è del tutto inutile. Vedi http://php.net/manual/en/ref.pdo- mysql.php
. Il MYSQL_ATTR_INIT_COMMAND
viene eseguito subito dopo aver stabilito la connessione, non più tardi. Se lo imposti su un oggetto PDO già completamente creato, è troppo tardi e non verrà mai eseguito. Devi passarlo al costruttore:
new PDO(..., ..., ..., array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'))
In alternativa, se la tua versione di PHP lo supporta, aggiungi charset=utf8
al DSN.