Dies:
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, 'SET NAMES utf8');
ist völlig sinnlos. Siehe http://php.net/manual/en/ref.pdo- mysql.php
. Der MYSQL_ATTR_INIT_COMMAND
wird direkt nach dem Verbindungsaufbau ausgeführt, spätestens jedoch. Wenn Sie dies auf ein bereits vollständig erstelltes PDO-Objekt setzen, ist es zu spät und es wird nie ausgeführt. Sie müssen es an den Konstruktor übergeben:
new PDO(..., ..., ..., array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'))
Wenn Ihre PHP-Version dies unterstützt, fügen Sie alternativ charset=utf8
hinzu zum DSN.