NC1.xからNetCommons2.4.0.xへの移行

旧会社HPからの転記です。<br><br>


<div>NC1.xから2.4.0.xへの移行をする機会があったので、</div>
<div>メモを残しておきます。</div>
<div>
<h2>--- 環境</h2>
</div>
<div>windows8.1</div>
<div>XAMPPlite 1.6.2</div>
<div>
<h2>--- NCMigration1.0.3を使う</h2>
</div>
~~`http://www.netcommons.org/ダウンロード/NCMigration/`~~ 旧サイト閉鎖済み

<div>Get NCMigration1.0.3 for Windows</div>
<div>
<h2>--- 準備NC1</h2>
</div>
<div>・NC1.xは NetCommons1.1.4　にする</div>
<div>・サイト閉鎖中にする</div>
<div>
<h2>--- 準備NC2</h2>
</div>
<div>・NetCommons2.4.0.0.zipを用意する</div>
<div>・NetCommons2.4.0.0を同じサーバの別ディレクトリにインストール</div>
<div>・サイト閉鎖中にする</div>
<div>
<h2>--- 準備NCMigration</h2>
</div>
<div>・NCMigration1.0.3を同じサーバの別ディレクトリに設置</div>
<div>
<h2>--- サイト構成</h2>
</div>
<div>NC1 &nbsp; &nbsp; &nbsp; &nbsp; &rArr; http://localhost/</div>
<div>NC2 &nbsp; &nbsp; &nbsp; &nbsp; &rArr; http://localhost/nc2/</div>
<div>NCMigration &rArr; http://localhost/NCMigration/</div>
<div>
<h2>--- データ移行</h2>
</div>
<div>&nbsp;</div>
<div>http://localhost/NCMigration/</div>
<div>・「同意する＞＞」押下</div>
<div>&nbsp;</div>
<div>http://localhost/NCMigration/index.php?action=entry</div>
<div>&nbsp;</div>
<div>NetCommons1.1ルートディレクトリ：C:/Projects/xampp_lite/htdocs</div>
<div>NetCommons1.1管理者ログインID：（NC1の管理者ID）</div>
<div>NetCommons1.1管理者パスワード：（NC1のパスワード）</div>
<div>&nbsp;</div>
<div>NetCommons2.4ルートディレクトリ：C:/Projects/xampp_lite/htdocs/nc2</div>
<div>NetCommons1.1管理者ログインID：（NC2の管理者ID）</div>
<div>NetCommons1.1管理者パスワード：（NC2のパスワード）</div>
<div>&nbsp;</div>
<div>「設定内容の確認＞＞」押下</div>
<div>&nbsp;</div>
<div>http://localhost/NCMigration/index.php</div>
<div>全てOKなら</div>
<div>「データ移行開始＞＞」押下</div>
<div>&nbsp;</div>
<div>
<h2>--- エラー１</h2>
</div>
<div>&nbsp;</div>
<div>「データ移行開始＞＞」押下後、下記URLになって白画面のまま動かない。</div>
<div>http://localhost/NCMigration/index.php?action=result</div>
<div>
<h2>--- 対応１</h2>
</div>
<div>・NCMigration1.0.3</div>
<div>　\NCMigration1.0.3\templates_c\　にsmartyの古いファイルが残っていて、マイグレーション実行できなかった。</div>
<div>　&rArr; 古いファイルを消せば解消した。</div>
<div>
<h2>--- エラー２</h2>
</div>
<div>データ移行中に下記エラーで止まる。</div>
<div>
<blockquote class="quote">INSERT INTO netcommons2_pages_users_link(`room_id`,`user_id`,`role_authority_id`,`createroom_flag`,`insert_time`,`insert_site_id`,`insert_user_id`,`insert_user_name`,`update_time`,`update_site_id`,`update_user_id`,`update_user_name`) VALUES(?,?,?,?,?,?,?,?,?,?,?,?);:Array ( [room_id] =&gt; 9615 [user_id] =&gt; 6d2ec6f4f918347aef5cfb189bfedcd8d85ff44d [role_authority_id] =&gt; 4 [createroom_flag] =&gt; 0 [insert_time] =&gt; 20150327233503 [insert_site_id] =&gt; 0621068e454f23fc44c714e8eaef6f27f41b2662 [insert_user_id] =&gt; 6f08a38bcb67340f22bb7122d5e4ebdbe8c4c58d [insert_user_name] =&gt; XX5200 [update_time] =&gt; 20150327233503 [update_site_id] =&gt; 0621068e454f23fc44c714e8eaef6f27f41b2662 [update_user_id] =&gt; 6f08a38bcb67340f22bb7122d5e4ebdbe8c4c58d [update_user_name] =&gt; HA5217 ) :Duplicate entry '9615-6d2ec6f4f918347aef5cfb189bfedcd8d85ff44d' for key 1:C:\projects\xampp_lite\htdocs\NCMigration\model\utility.php:393</blockquote>
</div>
<div>
<h2>--- 対応２</h2>
</div>
<div>NC2のテーブル「netcommons2_pages_users_link」で本来重複しないはずのデータが重複していた。</div>
<div>エラーメッセージ「Duplicate entry '9615-6d2ec6f4f918347aef5cfb189bfedcd8d85ff44d' for key 1」</div>
<div>&nbsp;</div>
<div>移行元のNC1テーブル「nc1_rooms_members_link」を確認した処、ルーム参加データに重複があったため、</div>
<div>重複データを削除した処、解消した。</div>
<div>
<h2>--- エラー３</h2>
</div>
<div>移行が完了したけど、日本語が文字化けしていた。</div>
<div>
<h2>--- 対応３</h2>
</div>
<div>本来、MYSQL側の文字コード設定を EUC になっていれば文字化けしない。</div>
<div>&nbsp;</div>
<div>しかし、手元の古いxamppのmysqlに設定が反映されないため、</div>
<div>暫定対応で、NC1のDB接続は、SET NAMES 'ujis' を強制的に行うようにした。</div>
<div>&nbsp;</div>
```php5:\NCMigration\model\database.php
/**
 * NC1データベースコネクションオブジェクト設定
 *
 * @param string $dsn データソース名称（dbType://user:password@host/dbName?new）
 * @return void
 * @access public
 */
function setNC1ADOConnection($dsn)
{
	$dsn = $this-&gt;addDSNNew($dsn);
	$this-&gt;nc1ADOConnection = NewADOConnection($dsn);
	if (!empty($this-&gt;nc1ADOConnection)) {

<span style="color: #0000ff;">		// 追記箇所
		$adoConnection = $this-&gt;nc1ADOConnection;
		if (strpos($adoConnection-&gt;dataProvider, "mysql") === 0) {
			$serverInfo = $adoConnection-&gt;ServerInfo();
			if (floatval($serverInfo["version"]) &gt;= 4.01) {
				$adoConnection-&gt;Execute("SET NAMES 'ujis';");
			}
		}</span>

		$this-&gt;nc1ADOConnection-&gt;SetFetchMode(ADODB_FETCH_ASSOC);
	}
}
```
<div>これで文字化けは解消した。</div>

<div>
<h2>--- エラー４</h2>
</div>
<div>移行が完了したけど、﨑（たちさき）、髙（はしごだか）が文字化ける。</div>
<div>
<h2>--- 対応４</h2>
</div>
<div>▼ PHPで「EUC-JP」から「UTF-8」への文字コード変換</div>
<div><a href="http://www.labs816.com/note/179/" target="_blank" rel="noopener noreferrer">http://www.labs816.com/note/179/</a></div>
<div>&nbsp;</div>
<div>▼ EUC-JPからUTF8への変換の際にCP51932を使う - a long log</div>
<div><a href="http://longkey1.net/blog/2012/07/27/convert-encoding-utf8-to-eucjp-in-php/" target="_blank" rel="noopener noreferrer">http://longkey1.net/blog/2012/07/27/convert-encoding-utf8-to-eucjp-in-php/</a></div>
<div>&nbsp;</div>
<div>mb_convert_encodingで「EUC-JP」から「UTF-8」に文字変換時に文字化けしていた。</div>

```php5:\NCMigration\model\utility.php
/**
* EUCからUTF-8へ文字コードを変換
*
* @param string $str 変換対象文字列
* @return string 変換後文字列
* @access public
*/
function &convertEncoding($str)
{
    if (!function_exists("mb_convert_encoding")) {
        require_once ROOT_PATH . 'library' . DIRECTORY_SEPARATOR. 'jcode_1.35a' . DIRECTORY_SEPARATOR. 'jcode_wrapper.php';
        $str = jcode_convert_encoding($str, NC2_ENCODING, NC1_ENCODING);
    } else {
        //$str = mb_convert_encoding($str, NC2_ENCODING, NC1_ENCODING);
        $str = mb_convert_encoding(mb_convert_encoding($str, "CP51932", NC1_ENCODING), NC2_ENCODING, "CP51932");
    }

    return $str;
}
```
<div>ネット上の記事を参考に上記に修正して、再度移行を実行した処、文字化けが解消した。</div>