Detta:
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, 'SET NAMES utf8');
är helt meningslöst. Se http://php.net/manual/en/ref.pdo- mysql.php
. MYSQL_ATTR_INIT_COMMAND
exekveras direkt efter att anslutningen har upprättats, senast. Om du ställer in detta på ett redan färdigt skapat PDO-objekt är det för sent och det körs aldrig. Du måste skicka den till konstruktören:
new PDO(..., ..., ..., array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'))
Alternativt, om din PHP-version stöder det, lägg till charset=utf8
till DSN.