Удаленное подключение к 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. Если вы этого не сделаете, это выходит за рамки моих знаний.

  1. найдите файл конфигурации для сервера MySQL под названием my.cnf, Я нашел свой в /etc/my.cnf, Вы можете редактировать это с sudo nano /etc/my.cnf

  2. Ищите строку, которая говорит old_passwords=1 и измените это на old_passwords=0, Теперь вы сказали серверу, что в следующий раз, когда он будет запущен, и его попросят зашифровать пароль с помощью команды PASSWORD(), он использует новое 41-символьное шифрование, а не 16-символьное шифрование "старого" стиля.

  3. Теперь вам нужно перезапустить ваш MySQL сервер / сервис. YMMV, но на Fedora это было легко сделать с sudo service mysqld restart, Ознакомьтесь с инструкциями вашей ОС для перезапуска демона или сервиса mysql

  4. Теперь нам нужно отредактировать наш user таблица в MySQL. Так что откройте интерактивную оболочку для mysql (на сервере вы можете набрать mysql -uYourRootUsername -pYourRootPassword)

  5. Изменить на mysql база данных. Это база данных, которая содержит все хорошее для работы сервера и аутентификации. Вы должны иметь root-доступ для работы с этой базой данных. Если вы получаете "отказано в доступе", вы SOL. Сожалею. use mysql; переключится на эту базу данных

  6. Теперь мы хотим обновить пользователя, который доставлял вам горе. В конечном счете вы, вероятно, захотите обновить всех своих пользователей, но сейчас мы просто фокусируемся на пользователе, который выдал ошибку. update user set Password=password('YOUR_PASSWORD') where User='YOUR_USERNAME';

  7. Теперь вам просто нужно указать MySQL использовать новый пароль для аутентификации, когда этот пользователь пытается подключиться. flush privileges;,

Вам должно быть хорошо идти!

Другие вопросы по тегам