To:
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, 'SET NAMES utf8');
jest całkowicie bezcelowe. Zobacz http://php.net/manual/en/ref.pdo- mysql.php
. MYSQL_ATTR_INIT_COMMAND
jest wykonywane zaraz po nawiązaniu połączenia, nie później. Jeśli ustawisz to na już w pełni utworzonym obiekcie PDO, jest za późno i nigdy nie zostanie wykonane. Musisz przekazać go do konstruktora:
new PDO(..., ..., ..., array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'))
Alternatywnie, jeśli Twoja wersja PHP to obsługuje, dodaj charset=utf8
do DSN.