esto:
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, 'SET NAMES utf8');
es completamente inútil. Ver http://php.net/manual/en/ref.pdo- mysql.php
. El MYSQL_ATTR_INIT_COMMAND
se ejecuta inmediatamente después de establecer la conexión, no más tarde. Si configura esto en un objeto PDO ya completamente creado, es demasiado tarde y nunca se ejecuta. Necesitas pasarlo al constructor:
new PDO(..., ..., ..., array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'))
Alternativamente, si su versión de PHP lo admite, agregue charset=utf8
al DSN.