WPサイトを移動する時、データベースも移行する必要があるが、ほとんどの場合ホスト名が変わってしまうので、SQLファイル中のホスト名も変更しなければならない。
ただ、単にテキストエディタで一括置換すると一つ問題が発生する。
それは、phpのserialize()関数で作成されたデータがある場合、置換前と置換後で文字列長が変わってしまって、unserialize()出来ない事がある。
これを回避するには、sqlファイル中からシリアライズデータを抽出して再生成してやる必要がある。
と言うことで、テキストエディタではなく、置換用のphpスクリプトを自作してみた。それが以下である。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<?php $out = ''; // 出力データ $fn = 'infile.sql'; // 入力ファイル $rows = file($fn); // ファイルを読み込んで配列に格納 $s = 'source_string'; // 置換前文字列 $d = 'dest_string'; // 置換後文字列 $sq = addslashes($s); $dq = addslashes($d); foreach( $rows as $row ) { // 各行の処理 if ( strpos($row,$s)){ $row = preg_replace('!'.$sq.'!',$d,$row); // まずは文字列置換 if ( $arr = preg_split("!('.*?'[,\)])!", $row, null, PREG_SPLIT_DELIM_CAPTURE ) ) { $out_ar = ''; foreach ( $arr as $ar ) { $mt= []; if ( preg_match( "!^(')(a|O:\d+:\".+?\")(:\d+:\{.*".$dq.".*\})('.*$)!", $ar, $mt )) { // シリアライズデータの検出 $s1 = $mt[1]; $s2 = $mt[2]; $s3 = $mt[3]; $s4 = $mt[4]; $s23 = $s2.$s3; $s23 = preg_replace_callback('!s:(\d+):"([\s\S]*?)";!', function($m) { // シリアライズデータの再生成 return 's:' . strlen($m[2]) . ':"' . $m[2] . '";'; }, $s23); $ar_final = $s1.$s23.$s4; $out_ar .= $ar_final; } else { $out_ar .= $ar; } } $out .= $out_ar; } else { $out .= $row; } } else { $out .= $row; } } file_put_contents($fn.'.replace.sql',$out); // ファイル出力 ?> |
シリアライズ対象は数値配列とオブジェクトで、本当は数値や文字列もあるのだが、これらをシリアライズする必要性はそもそもほとんどゼロなので考慮していない。
これで正しく新サイトDBにインポート出来るようになる。
