适用于SP1、SP2系统升级到DedeCMSV6
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

430 lines
15KB

  1. <?php
  2. /**
  3. * @version $Id: index.php 2020-11-18 tianya $
  4. * @copyright Copyright (c) 2020, DedeBIZ.COM
  5. * @license https://www.dedebiz.com/license
  6. * @link https://www.dedebiz.com
  7. */
  8. // 把大象装冰箱,总共分几步?
  9. // 1.数据库转码
  10. // 2.文件选择性覆盖
  11. $cfg_NotPrintHead = "Y";
  12. require_once (dirname(__FILE__) . "/../include/common.inc.php");
  13. require_once (dirname(__FILE__) . "/common.func.php");
  14. define("TOV6LOCK", DEDEDATA."/cache/tov6.lock.txt");
  15. $bkdir = DEDEDATA.'/'.$cfg_backup_dir."/tov6";
  16. MkdirAll($bkdir,$GLOBALS['cfg_dir_purview']);
  17. $step = isset($step)? intval($step) : 0;
  18. //跳转到一下页的JS
  19. $gotojs = "function GotoNextPage(){
  20. document.gonext."."submit();
  21. }"."\r\nset"."Timeout('GotoNextPage()',500);";
  22. $dojs = "<script language='javascript'>$gotojs</script>";
  23. if ( empty($tablearr) )
  24. {
  25. $dsql->SetQuery("SHOW TABLES");
  26. $dsql->Execute('t');
  27. while($row = $dsql->GetArray('t',MYSQL_BOTH))
  28. {
  29. if(preg_match("#^{$cfg_dbprefix}#", $row[0])||in_array($row[0],$channelTables))
  30. {
  31. $dedeSysTables[] = $row[0];
  32. }
  33. }
  34. $tablearr = implode(",", $dedeSysTables);
  35. }
  36. if ( empty($bakfiles) )
  37. {
  38. $dh = dir($bkdir);
  39. $structfile = "";
  40. while(($filename=$dh->read()) !== false)
  41. {
  42. if(!preg_match("#txt$#", $filename))
  43. {
  44. continue;
  45. }
  46. if(preg_match("#tables_struct#", $filename))
  47. {
  48. $structfile = $filename;
  49. }
  50. else if( filesize("$bkdir/$filename") >0 )
  51. {
  52. $filelists[] = $filename;
  53. }
  54. }
  55. $dh->close();
  56. $bakfiles = implode(",", $filelists);
  57. }
  58. if (file_exists(TOV6LOCK)) {
  59. ShowMsgV6("<p>已经成功执行升级程序,无需重复执行。</p><p>如果您需要获取升级服务,可以<a target='_blank' href='https://www.dedebiz.com/contact#contact'>联系官方</a>协助升级。</p>","javascript:;");
  60. }
  61. if ($step == 0) {
  62. ShowMsgV6("<p>执行升级程序之前,您需要<font color=red>备份站点数据库及文件</font>,如果已经完成备份,可以点击下面“开始升级到V6”进行升级!<br><a target='_blank' class='btn btn-outline-success' href='https://www.dedebiz.com/help/tov6.md'>升级文档</a> <a class='btn btn-success' href='index.php?step=1'>开始升级到V6</a></p><p>如果您需要获取升级服务,也可以<a target='_blank' href='https://www.dedebiz.com/contact#contact'>联系官方</a>协助升级。</p>","javascript:;");
  63. }
  64. // 对数据库进行编码转换
  65. else if ( $step == 1 )
  66. {
  67. if ( $cfg_soft_lang === "gb2312" )
  68. {
  69. //初始化使用到的变量
  70. $tables = explode(',', $tablearr);
  71. $isstruct = 1;
  72. if(!isset($startpos))
  73. {
  74. $startpos = 0;
  75. }
  76. if(!isset($iszip))
  77. {
  78. $iszip = 0;
  79. }
  80. if(empty($nowtable))
  81. {
  82. $nowtable = '';
  83. }
  84. if(empty($fsize))
  85. {
  86. $fsize = 2048;
  87. }
  88. $fsizeb = $fsize * 1024;
  89. //第一页的操作
  90. if($nowtable=='')
  91. {
  92. $tmsg = '';
  93. $dh = dir($bkdir);
  94. while($filename = $dh->read())
  95. {
  96. if(!preg_match("#txt$#", $filename))
  97. {
  98. continue;
  99. }
  100. $filename = $bkdir."/$filename";
  101. if(!is_dir($filename))
  102. {
  103. unlink($filename);
  104. }
  105. }
  106. $dh->close();
  107. $tmsg .= "发现是GBK编码系统,需要进行数据库转码...<br />";
  108. if($isstruct==1)
  109. {
  110. $bkfile = $bkdir."/tables_struct_".substr(md5(time().mt_rand(1000,5000).$cfg_cookie_encode),0,16).".txt";
  111. $mysql_version = $dsql->GetVersion();
  112. $fp = fopen($bkfile, "w");
  113. foreach($tables as $t)
  114. {
  115. $ttt = str_replace($cfg_dbprefix, $cfg_dbprefix."v6_", $t);
  116. fwrite($fp, "DROP TABLE IF EXISTS `$ttt`;\r\n\r\n");
  117. $dsql->SetQuery("SHOW CREATE TABLE ". $dsql->dbName .".".$t);
  118. $dsql->Execute('me');
  119. $row = $dsql->GetArray('me', MYSQL_BOTH);
  120. //去除AUTO_INCREMENT
  121. $row[1] = preg_replace("#AUTO_INCREMENT=([0-9]{1,})[ \r\n\t]{1,}#i", "", $row[1]);
  122. $eng1 = "#ENGINE=MyISAM[ \r\n\t]{1,}DEFAULT[ \r\n\t]{1,}CHARSET=gbk#i";
  123. $row[1] = preg_replace($eng1, "ENGINE=MyISAM CHARSET=utf8", $row[1]);
  124. $row[1] = str_replace("CREATE TABLE `".$cfg_dbprefix, "CREATE TABLE `".$cfg_dbprefix."v6_", $row[1]);
  125. $tableStruct = $row[1];
  126. $tableStruct = gb2utf8($tableStruct);
  127. fwrite($fp,''.$tableStruct.";\r\n\r\n");
  128. }
  129. fclose($fp);
  130. $tmsg .= "转化数据表结构信息完成...<br />";
  131. }
  132. $tmsg .= "<font color='red'>正在进行数据转化的初始化工作,请稍后...</font>";
  133. $doneForm = "<form name='gonext' method='post' action='index.php'>
  134. <input type='hidden' name='isstruct' value='$isstruct' />
  135. <input type='hidden' name='step' value='1' />
  136. <input type='hidden' name='fsize' value='$fsize' />
  137. <input type='hidden' name='tablearr' value='$tablearr' />
  138. <input type='hidden' name='nowtable' value='{$tables[0]}' />
  139. <input type='hidden' name='startpos' value='0' />
  140. <input type='hidden' name='iszip' value='$iszip' />\r\n</form>\r\n{$dojs}\r\n";
  141. PutInfo($tmsg, $doneForm);
  142. exit();
  143. }
  144. //执行分页备份
  145. else
  146. {
  147. $j = 0;
  148. $fs = array();
  149. $bakStr = '';
  150. //分析表里的字段信息
  151. $dsql->GetTableFields($nowtable);
  152. $tmpNowtable = str_replace($cfg_dbprefix, $cfg_dbprefix."v6_", $nowtable);
  153. $intable = "INSERT INTO `$tmpNowtable` VALUES(";
  154. while($r = $dsql->GetFieldObject())
  155. {
  156. $fs[$j] = trim($r->name);
  157. $j++;
  158. }
  159. $fsd = $j-1;
  160. //读取表的内容
  161. $dsql->SetQuery("SELECT * FROM `$nowtable` ");
  162. $dsql->Execute();
  163. $m = 0;
  164. $bakfilename = "$bkdir/{$nowtable}_{$startpos}_".substr(md5(time().mt_rand(1000,5000).$cfg_cookie_encode),0,16).".txt";
  165. while($row2 = $dsql->GetArray())
  166. {
  167. if($m < $startpos)
  168. {
  169. $m++;
  170. continue;
  171. }
  172. //检测数据是否达到规定大小
  173. if(strlen($bakStr) > $fsizeb)
  174. {
  175. $fp = fopen($bakfilename,"w");
  176. $bakStr = gb2utf8($bakStr);
  177. fwrite($fp,$bakStr);
  178. fclose($fp);
  179. $tmsg = "<font color='red'>完成到{$m}条记录的转化,继续转化{$nowtable}...</font>";
  180. $doneForm = "<form name='gonext' method='post' action='index.php'>
  181. <input type='hidden' name='step' value='1' />
  182. <input type='hidden' name='isstruct' value='$isstruct' />
  183. <input type='hidden' name='dopost' value='bak' />
  184. <input type='hidden' name='fsize' value='$fsize' />
  185. <input type='hidden' name='tablearr' value='$tablearr' />
  186. <input type='hidden' name='nowtable' value='$nowtable' />
  187. <input type='hidden' name='startpos' value='$m' />
  188. <input type='hidden' name='iszip' value='$iszip' />\r\n</form>\r\n{$dojs}\r\n";
  189. PutInfo($tmsg,$doneForm);
  190. exit();
  191. }
  192. //正常情况
  193. $line = $intable;
  194. for($j=0; $j<=$fsd; $j++)
  195. {
  196. if($j < $fsd)
  197. {
  198. $line .= "'".RpLine(addslashes($row2[$fs[$j]]))."',";
  199. }
  200. else
  201. {
  202. $line .= "'".RpLine(addslashes($row2[$fs[$j]]))."');\r\n";
  203. }
  204. }
  205. $m++;
  206. $bakStr .= $line;
  207. }
  208. //如果数据比卷设置值小
  209. if($bakStr!='')
  210. {
  211. $fp = fopen($bakfilename,"w");
  212. $bakStr = gb2utf8($bakStr);
  213. fwrite($fp,$bakStr);
  214. fclose($fp);
  215. }
  216. for($i=0; $i<count($tables); $i++)
  217. {
  218. if($tables[$i] == $nowtable)
  219. {
  220. if(isset($tables[$i+1]))
  221. {
  222. $nowtable = $tables[$i+1];
  223. $startpos = 0;
  224. break;
  225. }else
  226. {
  227. ShowMsgV6('完成数据备份转码,下面进行还原……', 'index?step=2');
  228. exit();
  229. }
  230. }
  231. }
  232. $tmsg = "<font color='red'>完成到{$m}条记录的转码,继续转码{$nowtable}...</font>";
  233. $doneForm = "<form name='gonext' method='post' action='index.php'>
  234. <input type='hidden' name='isstruct' value='$isstruct' />
  235. <input type='hidden' name='step' value='1' />
  236. <input type='hidden' name='fsize' value='$fsize' />
  237. <input type='hidden' name='tablearr' value='$tablearr' />
  238. <input type='hidden' name='nowtable' value='$nowtable' />
  239. <input type='hidden' name='startpos' value='$startpos'>\r\n</form>\r\n{$dojs}\r\n";
  240. PutInfo($tmsg,$doneForm);
  241. exit();
  242. }
  243. //分页备份代码结束
  244. } else {
  245. ShowMsgV6('当前系统就是UTF8程序,无需数据库编码转换,进行DedeCMSV6升级……', 'index?step=3');
  246. exit();
  247. }
  248. }
  249. // 还原为UTF8编码的文件
  250. else if ( $step == 2 )
  251. {
  252. if ( $cfg_soft_lang === "gb2312" )
  253. {
  254. @list($dbhost, $dbport) = explode(':', $GLOBALS['cfg_dbhost']);
  255. !$dbport && $dbport = 3306;
  256. $conn = mysqli_init();
  257. mysqli_real_connect($conn, $dbhost, $GLOBALS['cfg_dbuser'], $GLOBALS['cfg_dbpwd'], false, $dbport) or die("无法连接数据库");
  258. mysqli_query($conn, "SET character_set_connection=utf8,character_set_results=utf8,character_set_client=binary");
  259. mysqli_select_db($conn, $GLOBALS['cfg_dbname']);
  260. $bakfilesTmp = $bakfiles;
  261. $bakfiles = explode(',', $bakfiles);
  262. if(empty($structfile))
  263. {
  264. $structfile = "";
  265. }
  266. if(empty($delfile))
  267. {
  268. $delfile = 1;
  269. }
  270. if(empty($startgo))
  271. {
  272. $startgo = 0;
  273. }
  274. if($startgo==0 && $structfile!='')
  275. {
  276. $tbdata = '';
  277. $fp = fopen("$bkdir/$structfile", 'r');
  278. while(!feof($fp))
  279. {
  280. $tbdata .= fgets($fp, 1024);
  281. }
  282. fclose($fp);
  283. $querys = explode(';', $tbdata);
  284. foreach($querys as $q)
  285. {
  286. $rs = mysqli_query($conn, trim($q).';');
  287. if ( !$rs )
  288. {
  289. //$str = mysqli_error($conn);
  290. //var_dump($str);
  291. }
  292. //$str = mysqli_error($conn);
  293. //var_dump($str);
  294. //$dsql->ExecuteNoneQuery(trim($q).';');
  295. }
  296. if($delfile==1)
  297. {
  298. @unlink("$bkdir/$structfile");
  299. }
  300. $tmsg = "<font color='red'>完成数据表编码,准备转化数据...</font>";
  301. $doneForm = "<form name='gonext' method='post' action='index.php'>
  302. <input type='hidden' name='step' value='2' />
  303. <input type='hidden' name='startgo' value='1' />
  304. <input type='hidden' name='delfile' value='$delfile' />
  305. <input type='hidden' name='bakfiles' value='$bakfilesTmp' />
  306. </form>\r\n{$dojs}\r\n";
  307. PutInfo($tmsg, $doneForm);
  308. exit();
  309. }
  310. else
  311. {
  312. $nowfile = $bakfiles[0];
  313. $bakfilesTmp = preg_replace("#".$nowfile."[,]{0,1}#", "", $bakfilesTmp);
  314. $oknum=0;
  315. if( filesize("$bkdir/$nowfile") > 0 )
  316. {
  317. $fp = fopen("$bkdir/$nowfile", 'r');
  318. while(!feof($fp))
  319. {
  320. $line = trim(fgets($fp, 512*1024));
  321. if($line=="") continue;
  322. //$rs = $dsql->ExecuteNoneQuery($line);
  323. //var_dump($line);
  324. $rs = mysqli_query($conn, $line);
  325. if($rs) $oknum++;
  326. }
  327. fclose($fp);
  328. }
  329. if($delfile==1)
  330. {
  331. @unlink("$bkdir/$nowfile");
  332. }
  333. if($bakfilesTmp=="")
  334. {
  335. ShowMsgV6('成功转化所有数据,下面进行DedeCMSV6升级……', 'index.php?step=3');
  336. exit();
  337. }
  338. $tmsg = "成功转化{$nowfile}的{$oknum}条记录<br/><br/>正在准备转化其它数据...";
  339. $doneForm = "<form name='gonext' method='post' action='index.php'>
  340. <input type='hidden' name='step' value='2' />
  341. <input type='hidden' name='startgo' value='1' />
  342. <input type='hidden' name='delfile' value='$delfile' />
  343. <input type='hidden' name='bakfiles' value='$bakfilesTmp' />
  344. </form>\r\n{$dojs}\r\n";
  345. PutInfo($tmsg, $doneForm);
  346. exit();
  347. }
  348. } else {
  349. ShowMsgV6('当前系统就是UTF8程序,无需数据库编码转换,继续DedeCMSV6升级……', 'index?step=3');
  350. exit();
  351. }
  352. }
  353. // 执行DedeCMSV6增量SQL
  354. else if ( $step == 3 )
  355. {
  356. @list($dbhost, $dbport) = explode(':', $GLOBALS['cfg_dbhost']);
  357. !$dbport && $dbport = 3306;
  358. $conn = mysqli_init();
  359. mysqli_real_connect($conn, $dbhost, $GLOBALS['cfg_dbuser'], $GLOBALS['cfg_dbpwd'], false, $dbport) or die("无法连接数据库");
  360. mysqli_query($conn, "SET character_set_connection=utf8,character_set_results=utf8,character_set_client=binary");
  361. mysqli_select_db($conn, $GLOBALS['cfg_dbname']);
  362. $querys = explode(';', $v6sql);
  363. foreach( $querys as $key => $q )
  364. {
  365. $prefix="#@__";
  366. $q = str_replace($prefix, $GLOBALS['cfg_dbprefix']."v6_", $q);
  367. $q = str_replace("TYPE=MyISAM", "ENGINE=MyISAM", $q);
  368. $rs = mysqli_query($conn, trim($q).';');
  369. if ( !$rs )
  370. {
  371. // $str = mysqli_error($conn);
  372. // var_dump($str);
  373. }
  374. }
  375. // 重写配置
  376. ReWriteConfig($conn);
  377. // 数据库连接文件
  378. $sqlconn = file_get_contents(dirname(__FILE__)."/common.inc.txt");
  379. $sqlconn = str_replace("~dbtype~","mysql",$sqlconn);
  380. $sqlconn = str_replace("~dbhost~",$GLOBALS['cfg_dbhost'],$sqlconn);
  381. $sqlconn = str_replace("~dbname~",$GLOBALS['cfg_dbname'],$sqlconn);
  382. $sqlconn = str_replace("~dbuser~",$GLOBALS['cfg_dbuser'],$sqlconn);
  383. $sqlconn = str_replace("~dbpwd~",$GLOBALS['cfg_dbpwd'],$sqlconn);
  384. $sqlconn = str_replace("~dbprefix~",$GLOBALS['cfg_dbprefix']."v6_",$sqlconn);
  385. $sqlconn = str_replace("~dblang~","utf8",$sqlconn);
  386. file_put_contents(DEDEDATA."/common.inc.php", $sqlconn);
  387. file_put_contents(TOV6LOCK, "www.dedebiz.com");
  388. // rename(dirname(__FILE__)."/index.php",dirname(__FILE__)."/index.php.bak");
  389. ShowMsgV6('完成系统数据库转换升级,下载DedeCMSV6系统,解压后将<code>./src</code>目录下的文件选择性替换即可完成升级。<br><a class=\'btn btn-success\' target=\'_blank\' href=\'https://www.dedebiz.com/download\'>下载DedeCMSV6</a> ', 'javascript:;');
  390. exit();
  391. }
  392. ?>