Ini:
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, 'SET NAMES utf8');
sama sekali tidak ada gunanya. Lihat http://php.net/manual/en/ref.pdo- mysql.php
. MYSQL_ATTR_INIT_COMMAND
dijalankan tepat setelah koneksi dibuat, paling lambat. Jika Anda menyetel ini pada objek PDO yang sudah dibuat sepenuhnya, itu sudah terlambat dan tidak akan pernah dijalankan. Anda harus meneruskannya ke konstruktor:
new PDO(..., ..., ..., array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'))
Atau, jika versi PHP Anda mendukungnya, tambahkan charset=utf8
ke DSN.