Почему данные из БД выводятся в виде "абракадабры"?
<?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 шт):
Попробуйте так
$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');