Esse:
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, 'SET NAMES utf8');
é totalmente inútil. Veja http://php.net/manual/en/ref.pdo- mysql.php . O
MYSQL_ATTR_INIT_COMMAND
é executado logo após a conexão ser estabelecida, não mais tarde. Se você definir isso em um objeto PDO já totalmente criado, será tarde demais e ele nunca será executado. Você precisa passá-lo para o construtor:new PDO(..., ..., ..., array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'))
Como alternativa, se sua versão do PHP suportar, adicione
charset=utf8
ao DSN.