Ошибка при подключение php (PDO) к MySQL [caching_sha2_password]

164
05 декабря 2019, 02:10

Подключил Apache, MySQL в XAMPP - всё отлично.

Пытаюсь подключиться к базе данных через php, используя PDO. Вот код:

<?php
$driver  = 'mysql';
$host    = 'localhost';
$db_name = 'kontora';
$db_pass = 'password123';
$db_user = 'admin';
$charset = 'utf8';
$options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION];
try {
    $dbh = new PDO("$driver:host=$host;dbname=$db_name;charset=$charset", $db_user, $db_pass, $options);
} catch (Exception $e) {
    die($e);
}

Все данные верны, как я всё вводил (имя дб, юзер и т.д.).

В конце концов выдаёт ошибку:

PDOException: PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password] in D:\xampp\htdocs\kontora\index.php:12 Stack trace: #0 D:\xampp\htdocs\kontora\index.php(12): PDO->__construct('mysql:host=loca...', 'admin', 'password123', Array) #1 {main} Next PDOException: SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client in D:\xampp\htdocs\kontora\index.php:12 Stack trace: #0 D:\xampp\htdocs\kontora\index.php(12): PDO->__construct('mysql:host=loca...', 'admin', 'password123', Array) #1 {main}

Что делать?

Answer 1

Начиная с MySQL 8.0.4, мы меняем плагин аутентификации по умолчанию для сервера MySQL с mysql_native_password на caching_sha2_password. Соответственно, libmysqlclient теперь будет использовать caching_sha2_password как механизм аутентификации по умолчанию.

Cсылка на источник

В случае, если вы хотите использовать прежний способ аутентификации это возможно сделать добавив нового пользователя. Зайдите в консоль mysql и выполните команду:

CREATE USER user@localhost identified with mysql_native_password by 'password';

Теперь вы сможете подключиться пользователем user c паролем password

Answer 2

Вся проблема состояла в указании порта сервера. Так как это необязательный параметр, то у него есть свой стандарт, который как раз-таки у меня был отредактирован (в ходе исправления другой ошибки).

Вот код который у меня получился:

$dsn = "mysql:host=localhost;port=3307;dbname=kontora;charset=utf8";
$options = [
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    ];
$pdo = new PDO($dsn, 'admin', 'password123', $options);

Я также опустил блок try...catch... - в официальной документации указано, что PDO может сам вывести возникшее исключение.

READ ALSO
Как обрабатывать ошибки MVC PHP?

Как обрабатывать ошибки MVC PHP?

Всем приветПишу свою библиотеку для разработки приложений

161
Как подружить nuxt(node) и php?

Как подружить nuxt(node) и php?

Собственно есть сервер на нем настроен apache+php и отдельно крутится на nodejs nuxt, стал вопрос, как увязать их вместеNUXT отвечает за фронтэнд и php за бекэнд...

153