PHP5.6 が EOL(2)
MySQLiでのDB接続失敗について、ちょびっとだけ調べてみた
PHP 7に移行するのに避けては通れない道。MySQL拡張からMySQLi拡張への移行だけど、初っぱなのDBとのコネクションでコケてしまった。
元々のDB(MySQL)接続のソースはこんな感じ。
//connect db
$link = mysql_connect($SQL_HOST,$SQL_U_NAME,$SQL_PASS);
$active_db = mysql_select_db($SQL_DB, $link);
|
エラーチェックなんか何もしていない。MySQL DBとのコネクションは必ず成功する前程のソースだったりする。これをMySQLiに書き換えて、DBとのコネクションが失敗した時のことも考慮すると、こんな感じになるか。
//connect db
$active_db = mysqli_connect($SQL_HOST,$SQL_U_NAME,$SQL_PASS,$SQL_DB);
$res = mysqli_connect_errno();
if($res > 0){
exit("MySQL接続に失敗しました。code=".(string)$res);
}
|
これで動かしてみたところ DBコネクションが失敗し、その時のerrnoは2,000番だと言うことが分かった。こんなキリのいいerrnoはそうそうあるもんじゃないので、作った側も想定している良く起こるエラーに違いない。と言うことでググッてみたら、ほぼドンピシャの事例がいくつか見つかった。どうやらMySQLi拡張で使用するmysqlnd(MySQL Native Driver)は、パスワードを暗号化する際のハッシュ長が(古いMySQLで使われていた)16ビット長ではセキュリティ的に危ないってことで、41ビット長でないと接続が失敗するらしい。その際の errnoが2,000番ということのようだ(つまり PHP の mysqlndは「そんな弱い暗号化パスワードじゃ繋げねーぜ。エラーコード2,000で失敗だ!」って言ってるらしい)。
回避策としては、MySQLの設定を、古い暗号化パスワードは許可しない(old_passwords=0)にして、パスワードを再設定すれば良いようだ。以前と同じパスワードなら MySQL拡張でも接続できるし、MySQLiでも接続できるようになるはずなのだが・・・パスワードはDB内に保存されているのだから、作業前にDBのバックアップもしっかり採っておかないといかんよね。何かミスってDBと接続できない事態になったら全滅!バックアップから戻しても復旧できなかったら、閉鎖って可能性も・・・手順を整理してから慎重にやろうと思うので、ちょっと時間がかかるかもね。
|