Удаленная ошибка соединения с MySQL: «не удается подключиться к MySQL 4.1+ с использованием старой небезопасной аутентификации» из XAMPP - PullRequest
2 голосов
/ 13 декабря 2011

Я запускаю локальную копию 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 Ответ

6 голосов
/ 13 декабря 2011

Я не совсем понимаю, почему это стало проблемой при моей установке 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;.

Тебе пора идти!

...