Почему данные из БД выводятся в виде "абракадабры"?

<?php
    $driver = "mysql";
    $host = "localhost";
    $db_name = "dynweb";
    $db_user = "root";
    $db_pass = "";
    $charset = "UTF8";
    $options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION];

    try {
        $pdo = new PDO("$driver:host=$host;dbname=$db_name;charset=$charset",
        $db_user, $db_pass, $options);
    } catch (Exception $ex) {
        die("Не удалось подключиться к базе данных");
    }

    $result = $pdo->query("SELECT * FROM movies");
    while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
        echo "Фильм " . $row["title"] . " длится " . $row["duration"] . "минут.<br>";
    }

Кодировка для БД была установлена и в MySQL базе данных и в PHP-скрипте через метод PDO, но вс равно почему-то выводится абракадабра. В чем может быть проблема?


Ответы (2 шт):

Автор решения: Dmitriy Saxarov

Попробуйте так

$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
];

По первому примеру вот этой документации

→ Ссылка
Автор решения: Ипатьев

Кодировка веб-приложения настраивается в трех местах.

1. Кодировка данных в БД.

При создании таблицы надо установить кодировку utf8mb4 и проверить - установилась ли (SHOW CREATE TABLE movies). В описании таблицы должна стоять эта кодировка, а в описании полей не должна быть указана другая кодировка.

2. Кодировка соединения при получении данных из БД

- PDO

Для PDO кодировку соединения надо устанавливать в DSN. В самом вопросе приведен в целом правильный пример, но кодировку желательно ставить также utf8mb4. Плюс не следует ничего выводить на экран при ошибке соединения. Правильный код соединения должен выглядеть как-то так.

указание charset в DSN работает для всех версий РНР, выпущенных в течение последних 15 лет. Если ВДРУГ ваша версия более старая, то "абракадабры" - это ерунда по сравнению с другими проблемами

- mysqli

Для mysqli следует использовать функцию mysqli_set_charset(). Полный код подключения можно посмотреть здесь

3. HTML

Ткаже корректная кодировка должна быть задана при отображении HTML.

Правильнее всего это делать в настройках веб-сервера, но если по какой-то причине это невозможно, то можно задать прямо в РНР:

header('Content-Type: text/html; charset=utf-8');
→ Ссылка