2014.
09.
10
14:35:19
結論から書くと、互換性の問題です。
PHP5.3以降から、MySQLの古い形式(ハッシュ値の長さが16バイト)のパスワードを
サポートしなくなったのが原因です。
MySQL側のパスワードを新しい形式(ハッシュ値の長さが41バイト)にするしかないっぽいですね。
なお、パスワードを新形式にする方法は、例えば以下の通りです。
1.「my.cnf」にある「old_passwords=1」の記述を削除。もしくは「old_passwords=0」に変更
2.MySQL(mysqld)を再起動
3.パスワードを再設定(パスワードとして設定する文字列は前と同じでOK)
それでは、詳細を書いていきます。
お客さまから「PHPのバージョンを上げたらエラーになった」とご連絡をいただきました。
調べてみると、DB接続でエラーになっているようです。
エラーの内容は以下の通りでした。
該当箇所のコードはこんな感じφ(--)
(´・д・`)ェー
DBに接続してるだけじゃん。
PHPのバージョン上げたからって、こんなのに影響あるかよ?!と思ったら、ありました(^^ゞ
MySQLでは、パスワードをハッシュ値に変換して保存しています。
そのハッシュ値の長さは、2014年9月現在の最新バージョンでは41バイトです。
でも古いバージョンのMySQLでは16バイトでした。
MySQLでは、互換性を保持する為に古い形式のパスワードをサポートしています。
MySQLの設定ファイル「my.cnf」に
の記述があると、パスワードのハッシュ値を16バイトで生成してくれるのだそうです。
ところがですね。
PHP側はこいつに対する対応を止めました。
PHP5.3以降では「ハッシュ値が16バイトのパスワードなんて知らねーよ」なのです。
そのため、PHP5.3以降で、旧形式のパスワードが設定されたMySQLのユーザ情報を使って
「mysql_connect()」を実行すると、上記のエラーになります。
なんてこったい。
対処法はハッシュ値が41バイトのパスワードを設定したユーザ情報を使うことですね。
MySQLの設定ファイル「my.cnf」に
の記述があるとパスワードのハッシュ値が16バイトで生成されるので、
この記述を消すか「1」を「0」に変更します。
次にmysqldを再起動して、変更内容を反映させます。
残念ながら、今までに設定したパスワードのハッシュ値が
自動的に16バイトから41バイトに変更されるなんてことはありません。
パスワードを再設定します。
再設定するパスワードは同じもので大丈夫です。
単にハッシュ値の長さを16バイトから41バイトにしたいだけなので。
再設定することで16バイトのハッシュ値だったのが41バイトのハッシュ値に変わります。
これで私の環境では状況が改善しました。
いつの世も互換性の問題は面倒くさいですね(--ゞ
取りあえず、完了\(--)/
PHP5.3以降から、MySQLの古い形式(ハッシュ値の長さが16バイト)のパスワードを
サポートしなくなったのが原因です。
MySQL側のパスワードを新しい形式(ハッシュ値の長さが41バイト)にするしかないっぽいですね。
なお、パスワードを新形式にする方法は、例えば以下の通りです。
1.「my.cnf」にある「old_passwords=1」の記述を削除。もしくは「old_passwords=0」に変更
2.MySQL(mysqld)を再起動
3.パスワードを再設定(パスワードとして設定する文字列は前と同じでOK)
それでは、詳細を書いていきます。
お客さまから「PHPのバージョンを上げたらエラーになった」とご連絡をいただきました。
調べてみると、DB接続でエラーになっているようです。
エラーの内容は以下の通りでした。
Warning: 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 /hoge/test.php on line 35
該当箇所のコードはこんな感じφ(--)
if(!($cn = @mysql_connect("server", "id", "password"))) {
throw new Exception("データベースとの接続に失敗しました。". __LINE__);
}
throw new Exception("データベースとの接続に失敗しました。". __LINE__);
}
(´・д・`)ェー
DBに接続してるだけじゃん。
PHPのバージョン上げたからって、こんなのに影響あるかよ?!と思ったら、ありました(^^ゞ
MySQLでは、パスワードをハッシュ値に変換して保存しています。
そのハッシュ値の長さは、2014年9月現在の最新バージョンでは41バイトです。
でも古いバージョンのMySQLでは16バイトでした。
MySQLでは、互換性を保持する為に古い形式のパスワードをサポートしています。
MySQLの設定ファイル「my.cnf」に
old_password = 1
の記述があると、パスワードのハッシュ値を16バイトで生成してくれるのだそうです。
ところがですね。
PHP側はこいつに対する対応を止めました。
PHP5.3以降では「ハッシュ値が16バイトのパスワードなんて知らねーよ」なのです。
そのため、PHP5.3以降で、旧形式のパスワードが設定されたMySQLのユーザ情報を使って
「mysql_connect()」を実行すると、上記のエラーになります。
なんてこったい。
対処法はハッシュ値が41バイトのパスワードを設定したユーザ情報を使うことですね。
MySQLの設定ファイル「my.cnf」に
old_password = 1
の記述があるとパスワードのハッシュ値が16バイトで生成されるので、
この記述を消すか「1」を「0」に変更します。
次にmysqldを再起動して、変更内容を反映させます。
残念ながら、今までに設定したパスワードのハッシュ値が
自動的に16バイトから41バイトに変更されるなんてことはありません。
パスワードを再設定します。
再設定するパスワードは同じもので大丈夫です。
単にハッシュ値の長さを16バイトから41バイトにしたいだけなので。
再設定することで16バイトのハッシュ値だったのが41バイトのハッシュ値に変わります。
これで私の環境では状況が改善しました。
いつの世も互換性の問題は面倒くさいですね(--ゞ
取りあえず、完了\(--)/