Удаленное подключение к MySQL выдает ошибку "невозможно подключиться к MySQL 4.1+ с использованием старой небезопасной аутентификации" из XAMPP
Я запускаю локальную копию WordPress на XAMPP/WinXP для разработки, но хотел бы сохранить соединение с удаленной базой данных. Я продолжаю получать сообщение "Ошибка при установлении соединения с базой данных", независимо от того, что я пытаюсь.
На этом же компьютере я могу подключиться к удаленной базе данных MySQL, используя любое количество клиентов mySQL, а на стороне mySQL и пользователь, и база данных настроены на прием входящих запросов от любого домена подстановки. Я также могу легко пропинговать удаленный сервер базы данных со своего ПК (хотя я не знаю, как это сделать из WITHIN XAMPP).
Является ли XAMPP собственной маленькой вселенной, которая не может проникнуть во внешний мир? Или я что-то упускаю из виду, что не позволяет мне подключиться?
ошибки
Warning: mysql_connect() [function.mysql-connect]: Premature end of data (mysqlnd_wireprotocol.c:553) in C:\xampp\htdocs\dbtest.php on line 5
Warning: mysql_connect() [function.mysql-connect]: OK packet 1 bytes shorter than expected in C:\xampp\htdocs\dbtest.php on line 5
Warning: mysql_connect() [function.mysql-connect]: mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication
редактировать
Спасибо @Michael за предложение, что я просто создаю простой скрипт подключения, чтобы я мог лучше понять фактическую ошибку, которая выдается. Это показало, что это связано с настройкой old_password в mySQL. Смотрите мой ответ ниже для полного описания, как решить эту проблему.
Вот тестовый скрипт, который я вставил в свой xampp\htdocs
папка и проверено:
<?php
$mysqli = new mysqli('my.server.address', 'user_name', 'password', 'database_name');
if ($mysqli->connect_error){
die ("Connect error: " . $mysqli->connect_error );
}
1 ответ
Я не совсем понимаю, почему это стало проблемой для моей установки XAMPP, так как я также запускаю PHP 5.3.x на локальном компьютере сервера и не испытывал там этих проблем. Однако это связано с тем, что мой сервер MySQL работает в режиме шифрования "старый пароль". В новых версиях PHP такие соединения не разрешены, поэтому вам необходимо обновить сервер mySQL, чтобы использовать более новое шифрование паролей. Вот шаги, при условии, что у вас есть контроль над сервером MySQL. Если вы этого не сделаете, это выходит за рамки моих знаний.
найдите файл конфигурации для сервера MySQL под названием
my.cnf
, Я нашел свой в/etc/my.cnf
, Вы можете редактировать это сsudo nano /etc/my.cnf
Ищите строку, которая говорит
old_passwords=1
и измените это наold_passwords=0
, Теперь вы сказали серверу, что в следующий раз, когда он будет запущен, и его попросят зашифровать пароль с помощью команды PASSWORD(), он использует новое 41-символьное шифрование, а не 16-символьное шифрование "старого" стиля.Теперь вам нужно перезапустить ваш MySQL сервер / сервис. YMMV, но на Fedora это было легко сделать с
sudo service mysqld restart
, Ознакомьтесь с инструкциями вашей ОС для перезапуска демона или сервиса mysqlТеперь нам нужно отредактировать наш
user
таблица в MySQL. Так что откройте интерактивную оболочку для mysql (на сервере вы можете набратьmysql -uYourRootUsername -pYourRootPassword
)Изменить на
mysql
база данных. Это база данных, которая содержит все хорошее для работы сервера и аутентификации. Вы должны иметь root-доступ для работы с этой базой данных. Если вы получаете "отказано в доступе", вы SOL. Сожалею.use mysql;
переключится на эту базу данныхТеперь мы хотим обновить пользователя, который доставлял вам горе. В конечном счете вы, вероятно, захотите обновить всех своих пользователей, но сейчас мы просто фокусируемся на пользователе, который выдал ошибку.
update user set Password=password('YOUR_PASSWORD') where User='YOUR_USERNAME';
Теперь вам просто нужно указать MySQL использовать новый пароль для аутентификации, когда этот пользователь пытается подключиться.
flush privileges;
,
Вам должно быть хорошо идти!