Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > обращение к MySQL из PHP


Автор: Kludge 12.1.2006, 20:57
smile через MS БД работает. проверено

пришло время обращаться к БД через PHP.
Код

<?
    $link = mysql_connect("localhost", "root", "mypass")
        or die("Не могу соединиться");
    print ("Соединение прошло успешно");
    mysql_close($link);
?>

Цитата

Warning: mysql_connect(): Client does not support authentication protocol requested by server; consider upgrading MySQL client in C:\Sites\home\localhost\www\anketa.php on line 2
Не могу соединиться


Пробовал второй способ как обычно через MS
Цитата

-uroot -pmypass


Код

<?
    $link = mysql_connect("localhost", "-uroot", "-pmypass")
        or die("Не могу соединиться");
    print ("Соединение прошло успешно");
    mysql_close($link);
?>

Цитата

Warning: mysql_connect(): Access denied for user '-uroot'@'localhost' (using password: YES) in C:\Sites\home\localhost\www\anketa.php on line 2
Не могу соединиться


последняя картина вроде как приятнее чем первая, но ...

Подскажите пожалуйста, что я не так делаю.

MySQL как служба работает.
на компе стоит Апач, PHP 4, MySQL 4.1

Автор: mr.fox 12.1.2006, 21:17
открой файл my.ini и добавь туда такую строку
Цитата

old_passwords

в поле mysqld
перезапусти серв, и будет тебе счастье

Автор: Kludge 12.1.2006, 21:34
smile
неа, не хотит

Автор: mr.fox 12.1.2006, 22:08
Цитата(Kludge @ 12.1.2006, 20:57 Найти цитируемый пост)

$link = mysql_connect("localhost", "root", "mypass")

подключаться надо только так
Цитата(Kludge @ 12.1.2006, 20:57 Найти цитируемый пост)

Warning: mysql_connect(): Client does not support authentication protocol requested by server; consider upgrading MySQL client in C:\Sites\home\localhost\www\anketa.php on line 2
Не могу соединиться

а покажи второю строчку кода

Автор: Illuminaty 12.1.2006, 22:25
mr.fox, насколько я умею считать, в коде
Цитата(Kludge @ 12.1.2006, 21:57 Найти цитируемый пост)
Код
<?
    $link = mysql_connect("localhost", "root", "mypass")
        or die("Не могу соединиться");
    print ("Соединение прошло успешно");
    mysql_close($link);
?>
вторая строчка - это $link = mysql_connect("localhost", "root", "mypass") smile

Автор: Mal Hack 12.1.2006, 22:36
http://forum.vingrad.ru/index.php?showtopic=58863&hl=old_password
http://forum.vingrad.ru/index.php?showtopic=69659&hl=old_password

Автор: Illuminaty 12.1.2006, 22:40
Скорее всего, судя по
Цитата(Kludge @ 12.1.2006, 21:57 Найти цитируемый пост)
Client does not support authentication protocol requested by server; consider upgrading MySQL client
надо скомпелировать PHP с ключом --with-mysql=/path/to/mysql, т.е. при PHP использует свою библиотеку, а надо, чтобы использовал библиотеку, установленную MySQL.

Автор: Kludge 13.1.2006, 07:32
вот эта вещь не хочет

line 8
Цитата

SET PASSWORD FOR $login@localhost = OLD_PASSWORD(‘$pass’);


выдает вотакое:
Цитата

Parse error: syntax error, unexpected T_STRING in C:\Sites\home\localhost\www\anketa.php on line 8


Цитата

надо скомпелировать PHP с ключом --with-mysql=/path/to/mysql, т.е. при PHP использует свою библиотеку, а надо, чтобы использовал библиотеку, установленную MySQL.

а это как? есть где почитать как это сделать?
в php.ini БД подключена, но все равно не хочет, а через консоль все нормально (тока ж мне надо к РHP прикрутить smile

Автор: Mal Hack 13.1.2006, 14:11
Kludge обрати внимание на то, как написано в топике, на который я дал ссылку.
Цитата
SET PASSWORD FOR login@localhost = OLD_PASSWORD(‘something’);

И что пишешь ты. Это пишется в файлах my.ini или my.cnf

Автор: Kludge 13.1.2006, 16:20
ну приписываю это дело в файл my.ini, и тогда БД как служюа вообще не запускается

тупость какая-то, неужели нельзя изготавливать уже готовые пакеты типа MySQL+PHP+сервер

дело дрянь . . .

Автор: Mal Hack 13.1.2006, 18:15
Цитата(Kludge @ 13.1.2006, 16:20 Найти цитируемый пост)

ну приписываю это дело в файл my.ini, и тогда БД как служюа вообще не запускается

Значит не правильно пишешь. Что мешает запустить mysqld из консоли и посмотреть ошибку?

Автор: Kludge 13.1.2006, 18:55
Вот ответы на все наши беды и несчастья!! smile
Ошибка при подключении к серверу: Client does not support authentication protocol

Начиная с версии 4.1, в My SQL используется новый протокол аутентификации. В новом протоколе алгоритм хеширования данных аутентифмкации отличается от алгоритма более ранних версий сервера My SQL. По сути вся проблема сводится к тому, что хеш пароля
“mypass” в версиях старше 4.1 (т.е. 4.1.*, 5.0.* и т.д.) имеет вид *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 (строка длиннее 41 байта), и тот же пароль “mypass” в версиях младше 4.1. (т.е. 4.0.*, 3.23.* и т.д.) имеет вид 6f8c114b58f2ce9e (строка 16 байт)

Теперь возникает ситуация. Вы обновляете сервер до версии старше 4.1., а клиент у Вас остается старый. Вы все правильно установили, сервер нормально запустился. Вы запускаете клиента, вводите логин и пароль соответствующей учетной записи, нажимаете Enter, Ваш СТАРЫЙ клиент хеширует данные авторизации по СТАРОМУ алгоритму и передает их на сервер. Сервер принимает эти данные и сранивает их с данными из таблицы mysql.user. В результате такого сравнения сервер видит, что хеши паролей не совпадают (всего 16 байт, вместо ожидаемых, как минимум, 41-го байта). Вследствие чего, сервер выдает вполне информативное сообщение:

Client does not support authentication protocol requested by server; consider upgrading MySQL client
Что бы решить возникшую проблему, можно пойти по одному из следующих путей:

Обновить всех клиентов (их библиотеки) до версии 4.1.1 или старше. Этот вариант идеальный, но не всегда подходит, потому что не для всех приложений существуют соответствующие обновленные библиотеки.
Создать для «старых» клиентов учетные записи, которые хранят хеш пароля в старом формате.
Для каждой учетной записи задать хеш пароля в старом формате. Это делается с помощью одной из двух конструкции:
Цитата

SET PASSWORD FOR 'some_user'@'some_host' = OLD_PASSWORD('newpwd');

или

UPDATE mysql.user SET Password = OLD_PASSWORD('newpwd') WHERE Host = 'some_host' AND User = 'some_user';
FLUSH PRIVILEGES;

Задать серверу в файле конфигурации (my.ini, my.cnf) директиву, которая указывает серверу использовать старый алгоритм хеширования пароля. Эта директива:
Цитата
-- old-passwords option

При этом не забудьте, что Вам нужно будет конвертировать хеши паролей из нового формата в старый формат. Это нужно будет сделить для всех учетных записей, у которых хеш пароля уже хранится в новом формате.
Для того, что бы выбрать пользователей, у которых хеши паролей хранятся в новом формате нужно написать запрос вида:
Цитата

SELECT Host, User, Password FROM mysql.user WHERE LENGTH(Password) > 16;

Далее, для каждого пользователя в полученной таблице вы конвертируете пароль любым из вариантов, предложенным пунктом выше.

--------------------------------------------------------------------------------
P.S.
Если Вы программируете на языке PHP и версия языка младше версии 5.1, то знайте, что расширение My SQL использует старый протокол аутентификации, т.е. Вам придется работать со старым протоколом аутентификации, и лучше всего перевести сервер в режим старого протокола авторизации. В PHP версий старше 5.1. существует расширение mysqli, которое поддерживает новый протокол аутентификации.
Не забудьте, что таблица mysql.user хранит хеши паролей. Эти хеши получены с помощью алгоритмов необратимого шифрования. Из этого следует, что Вы никогда не узнаете, какой пароль был источником для данного хеша и Вам придется создавать новые пароли для учетных записей. После создания паролей сообщите новые данные учетных записей всем пользователям этих учетных записей.

взято отсюда http://phpclub.ru/faq/wakka.php?wakka=MySQLOldPassword&v=16ec

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)