絖綛 N@i.jp  昨日:00010662
 今日:00008361
 総計:01736859
keywords
管理者専用
  Post   Add link   Control Panel 































新しいトピック
最新:11/14 16:41


新しいコメント
最新:07/28 16:47






管理人へMAIL

プライバシーポリシー

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と接続できない事態になったら全滅!バックアップから戻しても復旧できなかったら、閉鎖って可能性も・・・手順を整理してから慎重にやろうと思うので、ちょっと時間がかかるかもね。


< 過去の記事 [ 1月の Blog リスト ] 新しい記事 >

2019 calendar
1月
12345
6789101112
13141516171819
20212223242526
2728293031


掲示板
最新:08/15 17:19


GsBlog was developed by GUSTAV, Copyright(C) 2003, Web Application Factory All Rights Reserved.