适用于SP1、SP2系统升级到DedeCMSV6
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

373 行
13KB

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