Toto:
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, 'SET NAMES utf8');
je zcela zbytečné. Viz http://php.net/manual/en/ref.pdo- mysql.php
. MYSQL_ATTR_INIT_COMMAND
se provede ihned po navázání spojení, ne později. Pokud to nastavíte na již plně vytvořeném objektu PDO, je příliš pozdě a nikdy se nespustí. Musíte jej předat konstruktoru:
new PDO(..., ..., ..., array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'))
Případně, pokud to vaše verze PHP podporuje, přidejte charset=utf8
na DSN.