• Шаблонизатор BlackTiger :: демон для работы с nginx

  • Earth’s Geomagnetic Pole Reversal


  •  Бывает, создаёшь что-нибудь на PHP и MySQL, скажем, сайт, и на локалхосте всё-то отлично работает, казалось бы, всё отлажено и протестировано, даже mysql_real_escape_string всюду прописаны. А потом надо тебе перенести базу на хостинг какой, а сайт оставить на своём сервере. И как только php-код пытается подключиться к удалённой mySQL-базе...

    Warning: mysql_connect() [function.mysql-connect]: Premature end of data (mysqlnd_wireprotocol.c:554) in (цензура) on line 8

    Warning: mysql_connect() [function.mysql-connect]: OK packet 1 bytes shorter than expected in (цензура) on line 8

    Warning: mysql_connect() [function.mysql-connect]: mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication. Please use an administration tool to reset your password with the command SET PASSWORD = PASSWORD('your_existing_password'). This will store a new, and more secure, hash value in mysql.user. If this user is used in other scripts executed by PHP 5.2 or earlier you might need to remove the old-passwords flag from your my.cnf file in (цензура) on line 8

    Вот и со мною намедни приключились такие беды. Сразу скажу, что через несколько человеко-часов я нашёл решение.
    Проблема заключается в том, что на локалхосте у нас хороший новый PHP 5.3.x, в котором библиотека mysqlnd не поддерживает устаревший способ хеширования паролей в MySQL. А на этом дурацком хостинге пароли кэшируются как раз старым способом! Ну вот в этом третьем предупреждении нам советуют запустить какой-нибудь phpMyAdmin (уж он-то на этом хостинге есть, я надеюсь), и выполнить запрос
      SET PASSWORD = PASSWORD('Ваш_текущий_пароль')
    ну и ещё нам ненавязчиво предлагают поменять что-то в конфигах MySQL, что невозможно.
    Что ж делает команда SET PASSWORD? По сути это аналогично эдакому запросу
      UPDATE mysql.user SET password = PASSWORD('Ваш_текущий_пароль')
                                    WHERE host='текущий_хост' AND user='текущий_пользователь'
    А вот функция PASSWORD() создаёт хэш пароля. Потому что хранить пароль в базе данных в незашифрованном виде - это же отстой! Кхм, кхм... Проблема только в том, что если Вы выполните сей запрос, толку от этого не будет, потому что пароль зашифруется старым дедовским методом, а молодой да ранний PHP 5.3+ так не умеет, о чём я писал строками выше.
    Вы, возможно, спросите у меня: "Ну и что же делать, мать твою???7!!!!!111" И у меня есть ответ на этот вопрос.
    Зайдите на localhost/phpmyadmin, или ещё куда-нибудь, главное, чтобы там находился именно phpMyAdmin с доступом к вашей локальной базе данных mySQL 5.x. Войдите с правами суперпользователя (залогиньтесь под рутом, то бишь). Допустим, у Вас имеется пользователь user с паролем 123456. Если же такового не имеется, так создайте его, но желательно с каким-нибудь другим паролем. Теперь выберите базу данных mysql и откройте в ней таблицу user.

    Там Вы найдёте своего юзера с паролем, захэшированным новым способом. А теперь скопируйте этот хэш, зайдите в phpMyAdmin хостинга, на который Вы поклали Вашу базу данных, подключитесь нужным пользователем к базе данных, и выполните такой запрос.
    SET PASSWORD = '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'
    Как Вы, несомненно, заметили, мы просто скопировали хэш пароля, сгенерированный новым, правильным способом, и вставили его в запрос. И теперь всё заработает! Вуа, как говорится, ля.
    Надеюсь, кто-нибудь из дорогих читателей поймёт, что я имел в виду, а кому-нибудь, кто знает, этот текст покажется полезным.
















  • Шаблонизатор BlackTiger :: демон для работы с nginx

  • Earth’s Geomagnetic Pole Reversal