IT ·

تجربة النسخ الاحتياطي لـ GNUboard

لتحويل قاعدة البيانات الحالية من euc-kr إلى utf8، أخذت نسخة احتياطية بعناية (؟؟)، ثم

فتحتها باستخدام EditPlus، فظهرت رسالة تفيد بوجود أحرف قد تُفقد في الترميز الحالي،

تجاهلت ذلك وحولتها إلى UTF8 ثم استوردتها… تبًا ㅠㅠ لم ينجح الأمر بسبب الأحرف المشوهة

بحثت على عجل~~~~ وفي النهاية لم أجد حلًا..

(حتى مع تحديد جميع الخيارات، بما فيها –default-character-set عند تفريغ قاعدة البيانات، تحدث حالات كهذه ㅠㅠ)

لم يكن أمامي خيار، فعثرت على الشيفرة التالية وعدّلتها بما يناسبني (تحويل إلى UTF8 واختيار الجداول المطلوبة)

تم التحقق من عملية النقل!!!! – النقل مزعج ومتعب كما توقعت ㅠㅠ

 

<?
$mysql_host = '********';
$mysql_db = '********';
$mysql_user = '********';
$mysql_pass = '********';

$fileName = 'db-backup';
$extention = "sql";

// الجداول المطلوبة فقط~
$select[] = 'g4_board';
$select[] = 'g4_board_file';
$select[] = 'g4_board_good';
$select[] = 'g4_board_new';
$select[] = 'g4_config';
$select[] = 'g4_group';
$select[] = 'g4_group_member';
$select[] = 'g4_write_cast';
$select[] = 'g4_write_delphibbs';
$select[] = 'g4_write_english';
$select[] = 'g4_write_girl';
$select[] = 'g4_write_gy';
$select[] = 'g4_write_humor';
$select[] = 'g4_write_module';
$select[] = 'g4_write_mypage';
$select[] = 'g4_write_notice';
$select[] = 'g4_write_poll';
$select[] = 'g4_write_qna';
$select[] = 'g4_write_skin';
$select[] = 'g4_write_talk';
$select[] = 'g4_write_temp';
$select[] = 'g4_write_temppds';
$select[] = 'g4_write_test';
$select[] = 'g4_write_tiptech';
$select[] = 'g4_write_varios';

$all = false; // true لإنشاء عبارات INSERT كاملة
$drop = true; // true لتضمين عبارة DROP TABLE
 
mysql_connect( $mysql_host, $mysql_user, $mysql_pass ) || die("تعذر الاتصال بقاعدة البيانات.");
mysql_select_db( $mysql_db ) || die("فشل الاتصال بقاعدة البيانات");
 
function bak_getTableNames($db)
{
	$result[0] = mysql_list_tables($db);
	$result[1] = mysql_num_rows($result[0]);
	return $result;
}
 
function bak_getFields($table)
{
	global $all;
	$result = mysql_query("show fields from $table");
	$i = 0;
	while($keys = mysql_fetch_array($result)) 
	{
		if(!$i) $defaultOrder = $keys[Field];
		if($keys[Key] == 'PRI') 
		{
			$orderby = $keys[Field];
			break;
		}
		$i++;
	}
	if(!$orderby) $orderby = $defaultOrder;
	$result = mysql_query("select * from $table order by $orderby");
	$nums = mysql_num_fields($result);
	if($all == true) 
	{
		for($i=0;$i<$nums;$i++) 
		{
			$fields[] = mysql_field_name($result,$i);
		}
		$fields = "(".implode(",",$fields).") ";
	}
	while($rows = mysql_fetch_row($result)) 
	{
		for($i=0;$i<$nums;$i++) 
		{
			$temp = $rows[$i];
			$temp = str_replace("'","''", $temp);
			$temp = str_replace("","\", $temp);
			$temp = str_replace("n",'n', $temp);
			$temp = str_replace("r",'r', $temp);
			
			$temp = iconv('CP949', 'UTF-8', $temp);
			$insertValues[$i] = $temp;
		}
		$return .= "INSERT INTO $table ".$fields."values ('".implode("','",$insertValues)."');n";
	}
	return $return;
}
 
$tables = bak_getTableNames($mysql_db);

if($tables[1] > 0) 
{
	$backText = "
# MysqlDump
# المضيف: ".$mysql_host."
# وقت المعالجة: ".date('Y年 n月 j日 H時 i分')."
# إصدار الخادم: ".mysql_get_server_info()."
# قاعدة البيانات : `".$mysql_db."`
# --------------------------------------------------------nnnnn";

	while($rows = mysql_fetch_row($tables[0])) 
	{
		$chk = false;
		for($i=0;$i<count($select);$i++)
		{
			if($rows[0]==$select[$i])
			{
				$chk = true;
				break;
			}
		}
		
		if(!$chk)continue;

		$backText .= "
#
# بنية الجدول `".$rows[0]."`
#nn";
		$skima = mysql_fetch_array(mysql_query("SHOW CREATE TABLE ".$mysql_db.".".$rows[0]));
		if($drop == true) $backText .= "DROP TABLE IF EXISTS ".$skima[0].";nn";
		$backText .= "CREATE TABLE if not exists ".$skima[0]." ";
		$pos = strpos($skima[1]," (");
		$backText .= str_replace("`","",substr($skima[1],($pos+1))).";";

		$insert = bak_getFields($rows[0]);
		$backText .= "
#
# عبارة INSERT للجدول '".$rows[0]."'
#";
		if($insert) $backText .= "nnn".$insert;
		$backText .= "nnnnn";
	}

	header("Content-Type: application/octetstream");
	header("Content-Disposition: attachment; filename=".$fileName.".".$extention);
	header('Expires: 0');
	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
	header('Pragma: public');
	echo $backText;
}
?>

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *