MySQL PHP несовместимость - PullRequest
       17

MySQL PHP несовместимость

22 голосов
/ 27 августа 2009

Я использую WAMP локально, но подключаюсь к удаленной базе данных MySQL. Локальная версия PHP - последняя версия 5.3.0.

Одна из удаленных баз данных версии 5.0.45 работает нормально. Однако другая удаленная база данных, к которой я пытаюсь подключиться, - версия 5.0.22, выдает следующую ошибку перед смертью:

Предупреждение: mysql_connect () [function.mysql-connect]: пакет OK на 6 байт короче, чем ожидалось. PID = 5880 в ...

Предупреждение: mysql_connect () [function.mysql-connect]: mysqlnd не может подключиться к MySQL 4.1+ с использованием старой аутентификации в ...

WTF

UPDATE:

Возвращение к PHP 5.2. * То есть все, что ниже 5.3.0, решает проблему полностью. Пока я не использую 5.3.0, я могу подключиться к обеим базам данных. Я не уверен, что объяснение этой странности.

Ответы [ 9 ]

44 голосов
/ 27 августа 2009

Возможно, используемая учетная запись MySQL имеет старый 16-значный пароль (хэш).
Это можно проверить с помощью клиента MySQL (например, HeidiSQL, консольного клиента MySQL или любого другого клиента) и учетной записи, имеющей доступ к таблице mysql. user. Если поле Пароль содержит 16 символов, это старый пароль и mysqlnd не может использовать его для подключения к серверу MySQL.
Вы можете установить новый пароль для этого пользователя с помощью

SET PASSWORD FOR 'username'@'hostmask' = PASSWORD('thepassword')

см. dev_mysql_set_password

редактирование:
Вам также следует проверить, установлен ли на сервере использование / создание старых паролей по умолчанию .

edit2:
Пожалуйста, запустите запрос

SELECT
  Length(`Password`),
  Substring(`Password`, 1, 1)
FROM
  `mysql`.`user`
WHERE
  `user`='username'

на сервере 5.0.22 (тот, который "не работает"). Замените username на учетную запись, которую вы используете в mysql_connect ().
Что это возвращает?

7 голосов
/ 11 июня 2010

Я пытался найти простое решение этой проблемы. Попробуйте этот подход. В MySQL введите

SELECT Host, User, Password FROM mysql.user;

Если ваш пароль состоит из шестнадцати символов, это потому, что вы использовали OLD_PASSWORD для своего пользователя или использовали старую версию MySQL. Для обновления введите

UPDATE mysql.user SET Password=PASSWORD('newpass')
  WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;

замена root, localhost и newpass для вашего пользователя, хоста и прохода соответственно. Теперь, когда вы наберете

SELECT Host, User, Password FROM mysql.user;

Ваш пароль должен был измениться. Это исправило это для меня.

4 голосов
/ 27 августа 2009

Ваш сервер баз данных по умолчанию настроен на использование старых паролей. Вы получаете сообщение об ошибке: mysqlnd видит базу данных, которая может поддерживать новую (более безопасную) аутентификацию, но отказывается это делать. В таком случае mysqlnd прерывает соединение и отказывается работать.

Убедитесь, что ваш my.cnf не имеет

old-passwords = 1 

После того, как вы закомментируете этот параметр из my.cnf (или удалите его из того места, где он еще может быть установлен) и перезапустите свой сервер, не забудьте сбросить пароль с помощью команды, описанной VolkerK, иначе вы не будете быть в состоянии войти.

3 голосов
/ 01 апреля 2014

Более простое решение - удалить пользователя базы данных и создать нового с тем же именем пользователя и паролем.

2 голосов
/ 03 сентября 2010

Как сказал пользователь Evernoob выше:

"Возвращение к PHP 5.2. * Т.е. что-либо ниже, чем 5.3.0, решает проблему полностью. Пока я не использую 5.3.0, я могу подключиться к обеим базам данных. Я не уверен, что объяснение для этой странности "

В случае подключения к общему шлангу (в нашем случае DreamHost), который использует опцию oldpassword, мы не можем изменить таблицу пользователей. Эти предложенные параметры будут работать в других сценариях, но только не при использовании общего веб-хостинга.

Следует отметить, что мы используем WAMP.

1 голос
/ 13 декабря 2018

После долгих поисков и попыток я нашел способ без необходимости понижения / обновления MySQL и влияния на других пользователей работающего экземпляра MySQL.

Решение состоит в том, чтобы сбросить пароль с помощью:

для версий MySQL новее 5.7.5 (> 5.7.5):

ALTER USER 'mysqlUsername' @ 'hostname' ИДЕНТИФИЦИРОВАНО С mysql_native_password BY 'mysqlUsernamePassword';

для более старых версий MySQL: (<= 5.7.5) </p>

УСТАНОВИТЬ ПАРОЛЬ ДЛЯ 'mysqlUsername' @ 'hostname' = PASSWORD ( 'mysqlUsernamePassword');

Я нашел точку здесь !

Это заставило мою работать хорошо!

1 голос
/ 29 января 2017

У меня только что была эта проблема с сайтом Wordpress, который внезапно перестал работать и отобразил эту ошибку.

Я нашел графический интерфейс в панели управления веб-сайта, который позволил мне изменить пароль для пользователя базы данных. Я попытался изменить его на текущий пароль, но это было запрещено, поскольку текущий пароль был недостаточно надежным.

Я изменил пароль базы данных на новый, более надежный пароль и отредактировал свой файл wp-config.php, чтобы получить новый пароль.

Это сработало!

Так что я предполагаю, что хостинг-провайдер обновил что-то, возможно, MySQL, до версии, которая требует более надежных паролей. Для меня исправление состояло в том, чтобы использовать графический интерфейс cpanel для изменения пароля пользователя базы данных и обновить его до wp-config.php.

1 голос
/ 05 ноября 2010

Возвращаясь к PHP 5.2. * Сделали свое дело! СПАСИБО!

Если вы используете WAMP ... щелкните левой кнопкой мыши на wamp> php> version> get more>

выберите нужную версию и загрузите.

установить / запустить exe

щелкните левой кнопкой мыши wamp> php> версия> PHP 5.2. *

Это исправило эту проблему. Я не мог выполнить ни одну из этих команд SQL, не получив ошибку «команда запрещена пользователю« XXX »@« localhost »». Хорошо выглядишь, пытаясь войти как SU 'Root'. Может быть, на персональном сервере, но не на реальном хосте.

1 голос
/ 27 августа 2009

На моем веб-хосте настроены разные версии PHP / MySQL, и чтобы использовать определенную версию, мне нужно использовать правильное расширение .php, в частности .php5. Это может быть что-то простое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...