Ceci :
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, 'SET NAMES utf8');
est tout à fait inutile. Voir http://php.net/manual/en/ref.pdo- mysql.php
. Le MYSQL_ATTR_INIT_COMMAND
est exécuté juste après l'établissement de la connexion, pas plus tard. Si vous définissez ceci sur un objet PDO déjà entièrement créé, il est trop tard et il ne s'exécute jamais. Vous devez le passer au constructeur :
new PDO(..., ..., ..., array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'))
Sinon, si votre version PHP le prend en charge, ajoutez charset=utf8
à la DSN.