db.php 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. <?php
  2. /**
  3. * 数据库备份
  4. *
  5. *
  6. *
  7. */
  8. defined('InShopNC') or exit('Access Invalid!');
  9. class dbControl extends SystemControl{
  10. public function __construct(){
  11. parent::__construct();
  12. Language::read('db');
  13. }
  14. /**
  15. * 数据库管理
  16. */
  17. public function dbOp(){
  18. $lang = Language::getLangContent();
  19. $model_db = Model('db');
  20. $this->outputdb();
  21. /**
  22. * 保存数据库备份参数到session中
  23. */
  24. if ($_POST['form_submit'] == 'ok'){
  25. /**
  26. * 验证分卷大小
  27. */
  28. if (intval($_POST['file_size']) < 10){
  29. showMessage($lang['db_index_min_size']);
  30. }
  31. /**
  32. * 验证文件夹是否重复
  33. */
  34. if (is_dir(BASE_ROOT_PATH.DS.'sql_back'.DS.$_POST['backup_name'])) {
  35. showMessage($lang['db_index_name_exists']);
  36. }
  37. /**
  38. * 表列表
  39. */
  40. if ($_POST['backup_type'] == 'all'){
  41. $table_list = $model_db->getTableList('all');
  42. }
  43. if ($_POST['backup_type'] == 'custom'){
  44. /**
  45. * 验证是否未选
  46. */
  47. if (empty($_POST['tables'])){
  48. showMessage($lang['db_index_choose']);
  49. }
  50. if (is_array($_POST['tables'])){
  51. foreach ($_POST['tables'] as $k => $v){
  52. $table_list[] = $v;
  53. }
  54. }
  55. }
  56. /**
  57. * 将相关内容写入session
  58. */
  59. $_SESSION['db_backup'] = array();
  60. $_SESSION['db_backup']['size'] = intval($_POST['file_size'])*1024;
  61. $_SESSION['db_backup']['table_name'] = '';
  62. $_SESSION['db_backup']['op'] = 'create';
  63. $_SESSION['db_backup']['back_file'] = $_POST['backup_name'];
  64. $_SESSION['db_backup']['backup_tables'] = $table_list;
  65. $_SESSION['db_backup']['limit'] = 0;
  66. $_SESSION['db_backup']['md5'] = substr(md5(microtime(true)),0,5);
  67. showMessage($lang['db_index_backup_to_wait'],'index.php?act=db&op=db&step=1');
  68. }
  69. /**
  70. * 数据库备份步骤
  71. */
  72. if (intval($_GET['step']) >= 1){
  73. /**
  74. * 备份
  75. */
  76. $model_db->backUp(intval($_GET['step']));
  77. /**
  78. * 判断是否备份完毕
  79. */
  80. if (
  81. $_SESSION['db_backup']['op'] == 'insert' &&
  82. $_SESSION['db_backup']['backup_tables'][count($_SESSION['db_backup']['backup_tables'])-1] == $_SESSION['db_backup']['table_name'] &&
  83. intval($_GET['step']) > 1 &&
  84. $_SESSION['db_backup']['limit'] == 0){
  85. /**
  86. * 销毁
  87. */
  88. unset($_SESSION['db_backup']);
  89. /**
  90. * 跳转
  91. */
  92. $url = array(
  93. array(
  94. 'url'=>'index.php?act=db&op=db',
  95. 'msg'=>$lang['db_index_back_to_db']
  96. ),
  97. );
  98. showMessage($lang['db_index_backup_succ'],$url);
  99. }else {
  100. /**
  101. * 跳转
  102. */
  103. $url = array(
  104. array(
  105. 'url'=>'index.php?act=db&op=db&step='.(intval($_GET['step'])+1),
  106. 'msg'=>$lang['db_index_backuping']
  107. ),
  108. );
  109. showMessage($lang['db_index_backup_succ1'].intval($_GET['step']).$lang['db_index_backup_succ2'],$url);
  110. }
  111. }
  112. /**
  113. * 数据库列表
  114. */
  115. $table_list = $model_db->getTableList('all');
  116. /**
  117. * 取备份文件夹目录名
  118. */
  119. $back_dir = $model_db->getBackDir();
  120. Tpl::output('back_dir',$back_dir);
  121. Tpl::output('table_list',$table_list);
  122. Tpl::showpage('db.index');
  123. }
  124. /**
  125. * 数据库遍历
  126. */
  127. private function outputdb() {
  128. $db_id = intval($_GET['db_id']);
  129. $db_id = intval($_GET['db_id']);
  130. if($_GET['type'] == 'html') {
  131. $html_path = $model_special->getdbSpecialHtmlPath($db_id);
  132. if(!is_file($html_path)) {
  133. ob_start();
  134. Tpl::output('list', $data);
  135. Tpl::showpage('db_id');
  136. file_put_contents($html_path, ob_get_clean());
  137. }
  138. header('Location: ' . $model_special->getdblist($db_id));
  139. die;
  140. }
  141. }
  142. /**
  143. * 数据库恢复
  144. */
  145. public function db_restoreOp(){
  146. $lang = Language::getLangContent();
  147. /**
  148. * 删除
  149. */
  150. if ($_POST['form_submit'] == 'ok'){
  151. if (!empty($_POST['dir_name']) && is_array($_POST['dir_name'])){
  152. $dir = BASE_ROOT_PATH.DS.'sql_back';
  153. foreach ($_POST['dir_name'] as $k => $v){
  154. if (file_exists(BASE_ROOT_PATH.DS.'sql_back'.DS.$v)){
  155. $file_list = array();
  156. readFileList($dir.DS.$v,$file_list);
  157. /**
  158. * 删除文件
  159. */
  160. if (is_array($file_list)){
  161. foreach ($file_list as $k_file => $v_file){
  162. @unlink($dir.DS.$v.DS.$v_file);
  163. }
  164. }
  165. /**
  166. * 删除目录
  167. */
  168. @rmdir($dir.DS.$v);
  169. }else {
  170. showMessage($lang['db_restore_file_not_exists']);
  171. }
  172. }
  173. showMessage($lang['db_restore_del_succ']);
  174. }else {
  175. showMessage($lang['db_restore_choose_file_to_del']);
  176. }
  177. }
  178. $tmp_list = readDirList(BASE_ROOT_PATH.DS.'sql_back');
  179. /**
  180. * 整理内容
  181. */
  182. $dir_list = array();
  183. if (is_array($tmp_list)){
  184. foreach ($tmp_list as $k => $v){
  185. $dir_list[$k]['name'] = $v;
  186. $dir_list[$k]['make_time'] = date('Y-m-d H:i:s',filemtime(BASE_ROOT_PATH.DS.'sql_back'.DS.$v));
  187. $dir_list[$k]['size'] = number_format((getDirSize(BASE_ROOT_PATH.DS.'sql_back'.DS.$v)/1024),2).'KB';
  188. $dir_list[$k]['file_num'] = count(glob(BASE_ROOT_PATH.DS.'sql_back'.DS.$v.DS."*.sql"));
  189. }
  190. }
  191. Tpl::output('dir_list',$dir_list);
  192. Tpl::showpage('db.restore');
  193. }
  194. /**
  195. * 数据库备份导入
  196. */
  197. public function db_importOp(){
  198. $lang = Language::getLangContent();
  199. if ($_GET['dir_name'] != '' && file_exists(BASE_ROOT_PATH.DS.'sql_back'.DS.$_GET['dir_name'])){
  200. $model_db = Model('db');
  201. $result = $model_db->import($_GET['dir_name'],intval($_GET['step']));
  202. /**
  203. * 导入成功,返回列表
  204. */
  205. if ($result == 'succ'){
  206. $url = array(
  207. array(
  208. 'url'=>'index.php?act=db&op=db_restore',
  209. 'msg'=>$lang['db_import_back_to_list']
  210. ),
  211. );
  212. showMessage($lang['db_import_succ'],$url);
  213. }
  214. /**
  215. * 继续导入
  216. */
  217. if ($result == 'continue'){
  218. $url = array(
  219. array(
  220. 'url'=>'index.php?act=db&op=db_import&dir_name='.$_GET['dir_name'].'&step='.(intval($_GET['step'])+1),
  221. 'msg'=>$lang['db_import_going']
  222. ),
  223. );
  224. showMessage($lang['db_index_backup_succ1'].intval($_GET['step']).$lang['db_import_succ2'],$url);
  225. }
  226. /**
  227. * 导入失败
  228. */
  229. if ($result == false){
  230. showMessage($lang['db_import_fail'] );
  231. }
  232. }else {
  233. showMessage($lang['db_import_file_not_exists']);
  234. }
  235. }
  236. /**
  237. * 数据库 删除
  238. */
  239. public function db_delOp(){
  240. $lang = Language::getLangContent();
  241. if ($_GET['dir_name'] != '' && file_exists(BASE_ROOT_PATH.DS.'sql_back'.DS.$_GET['dir_name'])){
  242. $dir = BASE_ROOT_PATH.DS.'sql_back'.DS.$_GET['dir_name'];
  243. $file_list = array();
  244. readFileList($dir,$file_list);
  245. /**
  246. * 删除文件
  247. */
  248. if (is_array($file_list)){
  249. foreach ($file_list as $k => $v){
  250. @unlink($v);
  251. }
  252. }
  253. /**
  254. * 删除目录
  255. */
  256. @rmdir(BASE_ROOT_PATH.DS.'sql_back'.DS.$_GET['dir_name']);
  257. showMessage($lang['db_del_succ']);
  258. }else {
  259. showMessage($lang['db_restore_file_not_exists']);
  260. }
  261. }
  262. /**
  263. * ajax操作
  264. */
  265. public function ajaxOp(){
  266. switch ($_GET['branch']){
  267. /**
  268. * 数据库 sql列表
  269. */
  270. case 'db_file':
  271. if ($_GET['dir_name'] != '.' && $_GET['dir_name'] != '..' && is_dir(BASE_ROOT_PATH.DS.'sql_back'.DS.$_GET['dir_name'])){
  272. $dir = BASE_ROOT_PATH.DS.'sql_back'.DS.$_GET['dir_name'];
  273. $tmp = array();
  274. readFileList($dir,$tmp);
  275. /**
  276. * 整理内容
  277. */
  278. if (is_array($tmp)){
  279. $file_list = array();
  280. foreach ($tmp as $k => $v){
  281. $file_list[$k]['name'] = $v;
  282. $file_list[$k]['make_time'] = date('Y-m-d H:i:s',filemtime($dir.DS.$v));
  283. $file_list[$k]['size'] = number_format((filesize($dir.DS.$v)/1024),2).'KB';
  284. }
  285. $output = json_encode($file_list);
  286. print_r($output);
  287. }
  288. exit;
  289. }else {
  290. echo 'false';exit;
  291. }
  292. break;
  293. }
  294. }
  295. }