PHP 5.4 PDO не удалось подключиться к MySQL 4.1+, используя старую небезопасную аутентификацию
Я знаю, что есть тонны подобных вопросов, на самом деле я прочитал все (9) из них.
Однако ни одна из них не решает мою проблему.
У меня есть пакет с общим хостингом (минимум). В мой пакет входит доменное имя и отдельный IP-адрес, на котором размещен сервер MySQL. Для разработки я использую http://localhost/
с сервером разработки PHP 5.4, и я использую сервер MySQL, который я получаю в своем пакете хостинга.
Проблема возникает только на моем ПК, потому что я установил PHP 5.4, но мой веб-хост установил PHP 5.2.17 и не будет обновляться. Сервер MySQL находится на MySQL 5.1.50.
К счастью, phpMyAdmin имеет встроенную функцию "Изменить пароль".
В phpMyAdmin есть два варианта хэширования для смены пароля:
- MySQL 4.1+
- Совместимость с MySQL 4.0
Я изменил пароль с помощью параметра MySQL 4.1+, и он подтвердил, что обновление прошло успешно.
Профиль обновлен. SET PASSWORD = PASSWORD( '***' )
Однако, когда я выполняю этот запрос:
SELECT @@global.old_passwords, @@session.old_passwords, Length(PASSWORD('abc'));
Он говорит мне, что длина пароля все равно 16. Выход:
1 1 16
И поэтому проблема сохраняется.
Не удалось подключиться к базе данных. SQLSTATE [HY000] [2000] mysqlnd не может подключиться к MySQL 4.1+, используя старую небезопасную аутентификацию. Пожалуйста, используйте инструмент администрирования для reset вашего пароля с помощью команды SET PASSWORD = PASSWORD ('your_existing_password'). Это сохранит новое и более безопасное хэш-значение в mysql.user. Если этот пользователь используется в других сценариях, выполняемых PHP 5.2 или ранее, вам может потребоваться удалить флаг старых паролей из файла my.cnf
Я также пытался выполнить эти запросы при входе в систему с пользователем DBO в phpMyAdmin:
SET SESSION old_passwords=0;
[phpMyAdmin reloads to the home screen, but the value remains = 1]
SET GLOBAL old_passwords = 0;
#1227 - Access denied; you need the SUPER privilege for this operation
FLUSH PRIVILEGES;
#1227 - Access denied; you need the RELOAD privilege for this operation
Это противоречит тому, что указано в меню веб-хостинга для установки пользователя DBO:
Владелец базы данных
Когда вы создаете новую базу данных, вам нужно указать пользователя владельца базы данных (DBO), который будет иметь полный доступ администратора к базе данных.
Это что-то, что я должен заняться своими веб-хостами? Или это может решить мой пользователь DBO? В противном случае это можно обойти в PHP? (поскольку он работает с PHP 5.2.17, но не PHP 5.4)
Ответы
Ответ 1
РЕШИТЬ!
Хотя SET SESSION old_passwords=0;
не работал в phpMyAdmin.
Я загрузил Инструменты GUI MySQL и использовал MySQL Query Browser для выполнения той же команды для пользователя, не являющегося пользователем DBO:
SET SESSION old_passwords = 0;
SELECT @@global.old_passwords, @@session.old_passwords, Length(PASSWORD('abc'));
теперь возвращается:
1 0 41
Итак, я просто изменил пароль:
SET PASSWORD = PASSWORD('my_old_password')
И теперь PHP 5.4 PDO подключается к базе данных с этим пользователем!
Ответ 2
В phpMyAdmin
установка переменной сеанса будет работать, но вызов функции пароля должен происходить в том же сеансе/выполнении.
Например, если я выполняю:
SET SESSION old_passwords = 0;
SET PASSWORD = PASSWORD('notagoodpassword');
Он правильно установит его.
Ответ 3
это решение работало:
SET SESSION old_passwords = 0;
НО:
После этого мне пришлось сбросить "старую" пользовательскую таблицу очистки и создать ее новую - тогда она работала как шарм.