EC-Cubeのバージョンアップ(2.0.x→2.11.x)
- 2012年 9月18日

EC-Cubeのバージョンアップ(2.0.x→2.11.x)
EC-CubeのDB構成は古いバージョンと新しいバージョンでちょこっと変わっていて、DB移行で手こずったのでメモ。
今回のタスクはユーザテーブルのみの移行。商品データはそんなに多くなかったので手作業での移行でした。
ユーザのほうはパスワードがハッシュ化されていて手作業移行は当然できないので、ちゃんとやってあげる必要があります。
構造の違い
インストールしてみた新EC-Cubeと旧EC-Cubeのユーザテーブル(dtb_customer)の構造の違いを比べてみます。
新しいほうにはsaltという項目があって、cell01,cell02,cell03という項目が無くなっています。これらを調整します。
テーブル構成の調整方法
新EC-Cubeの認証ソースをみてみます。(class/util/SC_Utils.php)
 
    function sfIsMatchHashPassword($pass, $hashpass, $salt) {
        $res = false;
        if ($hashpass != '') {
            if (AUTH_TYPE == 'PLAIN') {
                if ($pass === $hashpass) {
                    $res = true;
                }
            } else {
                if (empty($salt)) {
                    // 旧バージョン(2.11未満)からの移行を考慮
                    $hash = sha1($pass . ':' . AUTH_MAGIC);
                } else {
                    $hash = SC_Utils_Ex::sfGetHashString($pass, $salt);
                }
                if ($hash === $hashpass) {
                    $res = true;
                }
            }
        }
        return $res;
    } 
上記ソースがパスワード認証しているところですが、saltが無いときには旧バージョンの認証方式をつかってくれるそうなのでsaltはブランクでも良さそうです。cell01,cell02,cell03は使ってる形跡が見つからなかったので、そのまま削除します。方針はこうなります。
- saltはブランクで挿入
- cell01,cell02,cell03は単純削除
旧EC-Cubeでデータバックアップ
アドミン画面>システム管理>バックアップ管理(/admin/system/bkup.php)からバックアップを作成します。
(テスト用お客様アカウントを持っていない場合は、移行後のテストのためにこの前にテストアカウントをひとつ作っておくのをおすすめします。)
できたバックアップをDLして解凍後、bkup_data.csvというファイルをテキストエディタで開きます。
このファイルにはDBダンプが特定のルールで書き込んでありますが、dtb_customerの部分だけが必要なので、その部分だけを抜き出し、正規表現等で加工します。僕はPHPで簡単なPGMをかきました。
 
			
			$text='  //ここにバックアップファイルからコピペ
			';
			$array=explode("\n",$text);
			foreach($array as $key=>$val){
				$rowArray = explode(",",$val);
				if($key==0){
					$keyArray = $rowArray;
				}else{
					foreach($rowArray as $tempKey=>$tempVal){
						$keyName = $keyArray[$tempKey];
						if($keyName=="cell01" or $keyName=="cell02" or $keyName=="cell03" ){
							continue;
						}elseif($keyName=="secret_key" ){
							$returnArrayOne["salt"]="";
						}
						$returnArrayOne[$keyName]=$tempVal;
					}
					$returnArray[]=$returnArrayOne;
				}
			}
			foreach($returnArray as $key=>$val){
				$rowText = "";
				foreach($val as $tempKey=>$tempVal){
					$rowText .= "$tempVal,";
				}
				$rowText=preg_replace("/,$/","",$rowText);
				$returnText .= $rowText."\n";
			}
			print($returnText);
			die();
ソースの中にテキストをコピペしちゃうあんちょこ方式ですが、これでCSV整形します。
新EC-Cubeへのデータインポート
あとはこれをphpMyAdmin等で新EC-Cubeに流し込むだけです。
ログインしてみる
バックアップ前につくっておいたテスト用お客様でログインしてみます。
、、、できないです。
ソース再確認
先ほども見た、認証ソースをみてみます。(class/util/SC_Utils.php)
                 if (empty($salt)) {
                    // 旧バージョン(2.11未満)からの移行を考慮
                    $hash = sha1($pass . ':' . AUTH_MAGIC);
                } else {
                    $hash = SC_Utils_Ex::sfGetHashString($pass, $salt);
                }
                if ($hash === $hashpass) {
                    $res = true;
                }旧バージョンの認証ではAUTH_MAGICとパスワードからハッシュの生成をしています。なので、AUTH_MAGICを確認してみましょう。
上記ファイルにそれぞれAUTH_MAGICの定義があります。
違ってます。そりゃそうですね。旧バージョンのAUTH_MAGICの値を新バージョンのAUTH_MAGICで書き換えます。
再度テスト
ログインできました!
まとめ
EC-Cubeの古いバージョンから新しいバージョンへの移行は苦労することが多そうなので、できるかぎり手作業でやって、どうしてもできないときには中のソースを読み解く必要がありそうです。
確か2.4から2.12への移行ツールはあった気がします。(よく覚えてないけど)たしかEC-CubeのオフィシャルからDLできるはずなので、とりあえず見てみるといいかもしれません。












