Това:
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, 'SET NAMES utf8');
е напълно безсмислено. Вижте http://php.net/manual/en/ref.pdo- mysql.php
. MYSQL_ATTR_INIT_COMMAND
се изпълнява веднага след установяване на връзката, не по-късно. Ако зададете това на вече напълно създаден PDO обект, е твърде късно и никога не се изпълнява. Трябва да го предадете на конструктора:
new PDO(..., ..., ..., array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'))
Като алтернатива, ако вашата версия на PHP го поддържа, добавете charset=utf8
към DSN.