Cái này:
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, 'SET NAMES utf8');
là hoàn toàn vô nghĩa. Xem http://php.net/manual/en/ref.pdo- mysql.php
. MYSQL_ATTR_INIT_COMMAND
được thực thi ngay sau khi kết nối được thiết lập, không muộn hơn. Nếu bạn đặt điều này trên một đối tượng PDO đã được tạo đầy đủ, thì đã quá muộn và nó không bao giờ thực thi. Bạn cần chuyển nó cho hàm tạo:
new PDO(..., ..., ..., array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'))
Ngoài ra, nếu phiên bản PHP của bạn hỗ trợ nó, hãy thêm charset=utf8
tới DSN.