当前位置:首页 > PHP教程 > php应用 > 列表

php实现数据库导出或导出成sql文件代码

发布:smiling 来源: PHP粉丝网  添加日期:2015-04-15 14:58:20 浏览: 评论:0 

本文章小编是整理了两段不同的代码可以实现数据库导出或导出成sql文件了,下面一起来看看,大家复制保存在指定文件即可.

php实现数据库备份导出成sql

1.首先要得到该数据库中有哪些表,所用函数 mysql_list_tables(),然后可以将获取的所有表名存到一个数组.

2.show create table 表名 可以获取表结构.

3.select * from 表名 取出所有记录,用循环拼接成 insert into... 语句.

php导出sql,导出成的sql语句效果,具体代码:

  1. <?php 
  2.  
  3.  header("Content-type:text/html;charset=utf-8"); 
  4.  
  5.  //配置信息 
  6.  $cfg_dbhost = 'localhost'
  7.  $cfg_dbname = 'ftdm'
  8.  $cfg_dbuser = 'root'
  9.  $cfg_dbpwd = 'root'
  10.  $cfg_db_language = 'utf8'
  11.  $to_file_name = "ftdm.sql"
  12.  // END 配置 
  13.  //链接数据库 
  14.  $link = mysql_connect($cfg_dbhost,$cfg_dbuser,$cfg_dbpwd); 
  15.  mysql_select_db($cfg_dbname); 
  16.  //选择编码 
  17.  mysql_query("set names ".$cfg_db_language); 
  18.  //数据库中有哪些表 
  19.  $tables = mysql_list_tables($cfg_dbname); 
  20.  //将这些表记录到一个数组 
  21.  $tabList = array(); 
  22.  while($row = mysql_fetch_row($tables)){ 
  23.   $tabList[] = $row[0]; 
  24.  } 
  25.  
  26.  echo "运行中,请耐心等待...<br/>"
  27.  $info = "-- ----------------------------\r\n"
  28.  $info .= "-- 日期:".date("Y-m-d H:i:s",time())."\r\n"
  29.  $info .= "-- 仅用于测试和学习,本程序不适合处理超大量数据\r\n"
  30.  $info .= "-- ----------------------------\r\n\r\n"
  31.  file_put_contents($to_file_name,$info,FILE_APPEND); 
  32.  //将每个表的表结构导出到文件 
  33.  foreach($tabList as $val){ 
  34.   $sql = "show create table ".$val
  35.   $res = mysql_query($sql,$link); 
  36.   $row = mysql_fetch_array($res); 
  37.   $info = "-- ----------------------------\r\n"
  38.   $info .= "-- Table structure for `".$val."`\r\n"
  39.   $info .= "-- ----------------------------\r\n"
  40.   $info .= "DROP TABLE IF EXISTS `".$val."`;\r\n"
  41.   $sqlStr = $info.$row[1].";\r\n\r\n"
  42.   //追加到文件 
  43.   file_put_contents($to_file_name,$sqlStr,FILE_APPEND); 
  44.   //释放资源 
  45.   mysql_free_result($res); 
  46.  }  //开源软件:phpfensi.com 
  47.  //将每个表的数据导出到文件 
  48.  foreach($tabList as $val){ 
  49.   $sql = "select * from ".$val
  50.   $res = mysql_query($sql,$link); 
  51.   //如果表中没有数据,则继续下一张表 
  52.   if(mysql_num_rows($res)<1) continue
  53.   // 
  54.   $info = "-- ----------------------------\r\n"
  55.   $info .= "-- Records for `".$val."`\r\n"
  56.   $info .= "-- ----------------------------\r\n"
  57.   file_put_contents($to_file_name,$info,FILE_APPEND); 
  58.   //读取数据 
  59.   while($row = mysql_fetch_row($res)){ 
  60.    $sqlStr = "INSERT INTO `".$val."` VALUES ("
  61.    foreach($row as $zd){ 
  62.     $sqlStr .= "'".$zd."', "
  63.    } 
  64.    //去掉最后一个逗号和空格 
  65.    $sqlStr = substr($sqlStr,0,strlen($sqlStr)-2); 
  66.    $sqlStr .= ");\r\n"
  67.    file_put_contents($to_file_name,$sqlStr,FILE_APPEND); 
  68.   } 
  69.   //释放资源 
  70.   mysql_free_result($res); 
  71.   file_put_contents($to_file_name,"\r\n",FILE_APPEND); 
  72.  } 
  73.  
  74.  echo "OK!"
  75.  
  76. ?> 

导入.sql文件到mysql数据库:

  1. <?php 
  2. /** 
  3.  *  
  4.  * ------1. 数据库备份(导出)------------------------------------------------------------ 
  5.  //分别是主机,用户名,密码,数据库名,数据库编码 
  6.  $db = new DBManage ( 'localhost', 'root', 'root', 'test', 'utf8' ); 
  7.  // 参数:备份哪个表(可选),备份目录(可选,默认为backup),分卷大小(可选,默认2000,即2M) 
  8.  $db->backup (); 
  9.  * ------2. 数据库恢复(导入)------------------------------------------------------------ 
  10.  //分别是主机,用户名,密码,数据库名,数据库编码 
  11.  $db = new DBManage ( 'localhost', 'root', 'root', 'test', 'utf8' ); 
  12.  //参数:sql文件 
  13.  $db->restore ( './backup/2014072125.sql'); 
  14.  *---------------------------------------------------------------------- 
  15.  */ 
  16. class DBManage  
  17.  var $db// 数据库连接 
  18.  var $database// 所用数据库 
  19.  var $sqldir// 数据库备份文件夹 
  20.  var $record
  21.  // 换行符 
  22.  private $ds = "\n"
  23.  // 存储SQL的变量 
  24.  public $sqlContent = ""
  25.  // 每条sql语句的结尾符 
  26.  public $sqlEnd = ";"
  27.  /** 
  28.   * 初始化 
  29.   * 
  30.   * @param string $host          
  31.   * @param string $username          
  32.   * @param string $password          
  33.   * @param string $thisatabase          
  34.   * @param string $charset          
  35.   */ 
  36.  function __construct($host = 'localhost'$username = 'root'$password = ''$thisatabase = 'test'$charset = 'utf8')  
  37.  { 
  38.   $this->host = $host
  39.   $this->username = $username
  40.   $this->password = $password
  41.   $this->database = $thisatabase
  42.   $this->charset = $charset
  43.   // 连接数据库 
  44.   $this->db = mysql_connect ( $this->host, $this->username, $this->password ) or die ( "数据库连接失败." ); 
  45.   // 选择使用哪个数据库 
  46.   mysql_select_db ( $this->database, $this->db ) or die ( "无法打开数据库" ); 
  47.   // 数据库编码方式 
  48.   mysql_query ( 'SET NAMES ' . $this->charset, $this->db ); 
  49.  } 
  50.  /* 
  51.   * ------------------------------------------数据库备份start---------------------------------------------------------- 
  52.   */ 
  53.  /** 
  54.   * 数据库备份 
  55.   * 参数:备份哪个表(可选),备份目录(可选,默认为backup),分卷大小(可选,默认2000,即2M) 
  56.   * 
  57.   * @param $string $dir          
  58.   * @param int $size          
  59.   * @param $string $tablename          
  60.   */ 
  61.  function backup($tablename = ''$dir$size)  
  62.  { 
  63.   $dir = $dir ? $dir : 'backup/'
  64.   $size = $size ? $size : 2000; 
  65.   $sql = ''
  66.   // 只备份某个表 
  67.   if (! emptyempty ( $tablename ))  
  68.   { 
  69.    echo '正在备份表' . $tablename . '<br />'
  70.    // 插入dump信息 
  71.    $sql = $this->_retrieve(); 
  72.    // 插入表结构信息 
  73.    $sql .= $this->_insert_table_structure ( $tablename ); 
  74.    // 插入数据 
  75.    $data = mysql_query ( "select * from " . $tablename ); 
  76.    // 文件名前面部分 
  77.    $filename = date ( 'YmdHis' ) . "_" . $tablename
  78.    // 字段数量 
  79.    $num_fields = mysql_num_fields ( $data ); 
  80.    // 第几分卷 
  81.    $p = 1; 
  82.    // 循环每条记录 
  83.    while ( $record = mysql_fetch_array ( $data ) )  
  84.    { 
  85.     // 单条记录 
  86.     $sql .= $this->_insert_record ( $tablename$num_fields$record ); 
  87.     // 如果大于分卷大小,则写入文件 
  88.     if (strlen ( $sql ) >= $size * 1000)  
  89.     {  //开源软件:phpfensi.com 
  90.      $file = $filename . "_v" . $p . ".sql"
  91.      if ($this->_write_file ( $sql$file$dir ))  
  92.      { 
  93.       echo "表-" . $tablename . "-卷-" . $p . "-数据备份完成,生成备份文件 <span style='color:#f00;'>$dir$filename</span><br />"
  94.      }  
  95.      else  
  96.      { 
  97.       echo "备份表-" . $tablename . "-失败<br />"
  98.      } 
  99.      // 下一个分卷 
  100.      $p ++; 
  101.      // 重置$sql变量为空,重新计算该变量大小 
  102.      $sql = ""
  103.     } 
  104.    } 
  105.    // sql大小不够分卷大小 
  106.    if ($sql != "")  
  107.    { 
  108.     $filename .= "_v" . $p . ".sql"
  109.     if ($this->_write_file ( $sql$filename$dir ))  
  110.     { 
  111.      echo "表-" . $tablename . "-卷-" . $p . "-数据备份完成,生成备份文件 <span style='color:#f00;'>$dir$filename</span><br />"
  112.     }  
  113.     else  
  114.     { 
  115.      echo "备份卷-" . $p . "-失败<br />"
  116.     } 
  117.    } 
  118.   }  
  119.   else  
  120.   { // 备份全部表 
  121.    if ($tables = mysql_query ( "show table status from " . $this->database ))  
  122.    { 
  123.     echo "读取数据库结构成功!<br />"
  124.    }  
  125.    else  
  126.    { 
  127.     exit ( "读取数据库结构成功!<br />" ); 
  128.    } 
  129.    // 插入dump信息 
  130.    $sql .= $this->_retrieve(); 
  131.    // 文件名前面部分 
  132.    $filename = date ( 'YmdHis' ) . "_all"
  133.    // 查出所有表 
  134.    $tables = mysql_query ( 'SHOW TABLES' ); 
  135.    // 第几分卷 
  136.    $p = 1; 
  137.    // 循环所有表 
  138.    while ( $table = mysql_fetch_array ( $tables ) )  
  139.    { 
  140.     // 获取表名 
  141.     $tablename = $table [0]; 
  142.     // 获取表结构 
  143.     $sql .= $this->_insert_table_structure ( $tablename ); 
  144.     $data = mysql_query ( "select * from " . $tablename ); 
  145.     $num_fields = mysql_num_fields ( $data ); 
  146.     // 循环每条记录 
  147.     while ( $record = mysql_fetch_array ( $data ) )  
  148.     { 
  149.      // 单条记录 
  150.      $sql .= $this->_insert_record ( $tablename$num_fields$record ); 
  151.      // 如果大于分卷大小,则写入文件 
  152.      if (strlen ( $sql ) >= $size * 1000)  
  153.      { 
  154.       $file = $filename . "_v" . $p . ".sql"
  155.       // 写入文件 
  156.       if ($this->_write_file ( $sql$file$dir ))  
  157.       { 
  158.        echo "-卷-" . $p . "-数据备份完成,生成备份文件<span style='color:#f00;'>$dir$file</span><br />"
  159.       }  
  160.       else  
  161.       { 
  162.        echo "备份卷-" . $p . "-失败<br />"
  163.       } 
  164.       // 下一个分卷 
  165.       $p ++; 
  166.       // 重置$sql变量为空,重新计算该变量大小 
  167.       $sql = ""
  168.      } 
  169.     } 
  170.    } 
  171.    // sql大小不够分卷大小 
  172.    if ($sql != "")  
  173.    { 
  174.     $filename .= "_v" . $p . ".sql"
  175.     if ($this->_write_file ( $sql$filename$dir ))  
  176.     { 
  177.      echo "-卷-" . $p . "-数据备份完成,生成备份文件 <span style='color:#f00;'>$dir$filename<br />"
  178.     }  
  179.     else  
  180.     { 
  181.      echo "备份卷-" . $p . "-失败<br />"
  182.     } 
  183.    } 
  184.   } 
  185.  } 
  186.  /** 
  187.   * 插入数据库备份基础信息 
  188.   * 
  189.   * @return string 
  190.   */ 
  191.  private function _retrieve() { 
  192.   $value = ''
  193.   $value .= '--' . $this->ds; 
  194.   $value .= '-- MySQL database dump' . $this->ds; 
  195.   $value .= '-- Created by DBManage class. ' . $this->ds; 
  196.   $value .= '-- http://www.111cn.net ' . $this->ds; 
  197.   $value .= '--' . $this->ds; 
  198.   $value .= '-- 主机: ' . $this->host . $this->ds; 
  199.   $value .= '-- 生成日期: ' . date ( 'Y' ) . ' 年  ' . date ( 'm' ) . ' 月 ' . date ( 'd' ) . ' 日 ' . date ( 'H:i' ) . $this->ds; 
  200.   $value .= '-- MySQL版本: ' . mysql_get_server_info () . $this->ds; 
  201.   $value .= '-- PHP 版本: ' . phpversion () . $this->ds; 
  202.   $value .= $this->ds; 
  203.   $value .= '--' . $this->ds; 
  204.   $value .= '-- 数据库: `' . $this->database . '`' . $this->ds; 
  205.   $value .= '--' . $this->ds . $this->ds; 
  206.   $value .= '-- -------------------------------------------------------'
  207.   $value .= $this->ds . $this->ds; 
  208.   return $value
  209.  } 
  210.  /** 
  211.   * 插入表结构 
  212.   * 
  213.   * @param unknown_type $table          
  214.   * @return string 
  215.   */ 
  216.  private function _insert_table_structure($table) { 
  217.   $sql = ''
  218.   $sql .= "--" . $this->ds; 
  219.   $sql .= "-- 表的结构" . $table . $this->ds; 
  220.   $sql .= "--" . $this->ds . $this->ds; 
  221.   // 如果存在则删除表 
  222.   $sql .= "DROP TABLE IF EXISTS `" . $table . '`' . $this->sqlEnd . $this->ds; 
  223.   // 获取详细表信息 
  224.   $res = mysql_query ( 'SHOW CREATE TABLE `' . $table . '`' ); 
  225.   $row = mysql_fetch_array ( $res ); 
  226.   $sql .= $row [1]; 
  227.   $sql .= $this->sqlEnd . $this->ds; 
  228.   // 加上 
  229.   $sql .= $this->ds; 
  230.   $sql .= "--" . $this->ds; 
  231.   $sql .= "-- 转存表中的数据 " . $table . $this->ds; 
  232.   $sql .= "--" . $this->ds; 
  233.   $sql .= $this->ds; 
  234.   return $sql
  235.  } 
  236.  /** 
  237.   * 插入单条记录 
  238.   * 
  239.   * @param string $table          
  240.   * @param int $num_fields          
  241.   * @param array $record          
  242.   * @return string 
  243.   */ 
  244.  private function _insert_record($table$num_fields$record) { 
  245.   // sql字段逗号分割 
  246.   $comma = ""
  247.   $insert .= "INSERT INTO `" . $table . "` VALUES("
  248.   // 循环每个子段下面的内容 
  249.   for($i = 0; $i < $num_fields$i ++) { 
  250.    $insert .= ($comma . "'" . mysql_escape_string ( $record [$i] ) . "'"); 
  251.    $comma = ","
  252.   } 
  253.   $insert .= ");" . $this->ds; 
  254.   return $insert
  255.  } 
  256.  /** 
  257.   * 写入文件 
  258.   * 
  259.   * @param string $sql          
  260.   * @param string $filename          
  261.   * @param string $dir          
  262.   * @return boolean 
  263.   */ 
  264.  private function _write_file($sql$filename$dir) { 
  265.   $dir = $dir ? $dir : './backup/'
  266.   // 不存在文件夹则创建 
  267.   if (! file_exists ( $dir )) { 
  268.    mkdir ( $dir ); 
  269.   } 
  270.   $re = true; 
  271.   if (! @$fp = fopen ( $dir . $filename"w+" )) { 
  272.    $re = false; 
  273.    echo "打开文件失败!"
  274.   } 
  275.   if (! @fwrite ( $fp$sql )) { 
  276.    $re = false; 
  277.    echo "写入文件失败,请文件是否可写"
  278.   } 
  279.   if (! @fclose ( $fp )) { 
  280.    $re = false; 
  281.    echo "关闭文件失败!"
  282.   } 
  283.   return $re
  284.  } 
  285.  /* 
  286.   * 
  287.   * -------------------------------上:数据库导出-----------分割线----------下:数据库导入-------------------------------- 
  288.   */ 
  289.  /** 
  290.   * 导入备份数据 
  291.   * 说明:分卷文件格式2014072125.sql 
  292.   * 参数:文件路径(必填) 
  293.   * 
  294.   * @param string $sqlfile          
  295.   */ 
  296.  function restore($sqlfile)  
  297.  { 
  298.   // 检测文件是否存在 
  299.   if (! file_exists ( $sqlfile ))  
  300.   { 
  301.    exit ( "文件不存在!请检查" ); 
  302.   } 
  303.   $this->lock ( $this->database ); 
  304.   // 获取数据库存储位置 
  305.   $sqlpath = pathinfo ( $sqlfile ); 
  306.   $this->sqldir = $sqlpath ['dirname']; 
  307.   // 检测是否包含分卷,将类似2014072125.sql从_v分开,有则说明有分卷 
  308.   $volume = explode ( "_v"$sqlfile ); 
  309.   $volume_path = $volume [0]; 
  310.   echo "请勿刷新及关闭浏览器以防止程序被中止,如有不慎!将导致数据库结构受损<br />"
  311.   echo "正在导入备份数据,请稍等!<br />"
  312.   if (emptyempty ( $volume [1] ))  
  313.   { 
  314.    echo "正在导入sql:<span style='color:#f00;'>" . $sqlfile . '</span><br />'
  315.    // 没有分卷 
  316.    if ($this->_import ( $sqlfile )) { 
  317.     echo "数据库导入成功!"
  318.    }  
  319.    else  
  320.    { 
  321.     exit ( '数据库导入失败!' ); 
  322.    } 
  323.   }  
  324.   else  
  325.   { 
  326.    //$volume_id = array(); 
  327.    // 存在分卷,则获取当前是第几分卷,循环执行余下分卷 
  328.    $volume_id = explode ( ".sq"$volume [1] ); 
  329.    // 当前分卷为$volume_id 
  330.    $volume_id = intval ( $volume_id [0] ); 
  331.    while ( $volume_id )  
  332.    { 
  333.     $tmpfile = $volume_path . "_v" . $volume_id . ".sql"
  334.     // 存在其他分卷,继续执行 
  335.     if (file_exists ( $tmpfile )) { 
  336.      // 执行导入方法 
  337.      echo "正在导入分卷$volume_id:<span style='color:#f00;'>" . $tmpfile . '</span><br />'
  338.      if ($this->_import ( $tmpfile ))  
  339.      { 
  340.      }  
  341.      else  
  342.      { 
  343.       exit ( "导入分卷$volume_id:<span style='color:#f00;'>" . $tmpfile . '</span>失败!可能是数据库结构已损坏!请尝试从分卷1开始导入' ); 
  344.      } 
  345.     }  
  346.     else  
  347.     { 
  348.      echo "此分卷备份全部导入成功!<br />"
  349.      return
  350.     } 
  351.     $volume_id++; 
  352.    } 
  353.   } 
  354.  } 
  355.  /** 
  356.   * 将sql导入到数据库(普通导入) 
  357.   * 
  358.   * @param string $sqlfile          
  359.   * @return boolean 
  360.   */ 
  361.  private function _import($sqlfile) { 
  362.   // sql文件包含的sql语句数组 
  363.   $sqls = array (); 
  364.   $f = fopen ( $sqlfile"rb" ); 
  365.   // 创建表缓冲变量 
  366.   $create = ''
  367.   while ( ! feof ( $f ) ) { 
  368.    // 读取每一行sql 
  369.    $line = fgets ( $f ); 
  370.    // 如果包含'-- '等注释,或为空白行,则跳过 
  371.    if (trim ( $line ) == '' || preg_match ( '/--*?/'$line$match )) { 
  372.     continue
  373.    } 
  374.    // 如果结尾包含';'(即为一个完整的sql语句,这里是插入语句),并且不包含'ENGINE='(即创建表的最后一句), 
  375.    if (! preg_match ( '/;/'$line$match ) || preg_match ( '/ENGINE=/'$line$match )) { 
  376.     // 将本次sql语句与创建表sql连接存起来 
  377.     $create .= $line
  378.     // 如果包含了创建表的最后一句 
  379.     if (preg_match ( '/ENGINE=/'$create$match )) { 
  380.      // 则将其合并到sql数组 
  381.      $sqls [] = $create
  382.      // 清空当前,准备下一个表的创建 
  383.      $create = ''
  384.     } 
  385.     // 跳过本次 
  386.     continue
  387.    } 
  388.    $sqls [] = $line
  389.   } 
  390.   fclose ( $f ); 
  391.   // 循环sql语句数组,分别执行 
  392.   foreach ( $sqls as $sql ) { 
  393.    str_replace ( "\n"""$sql ); 
  394.    if (! mysql_query ( trim ( $sql ) )) { 
  395.     echo mysql_error (); 
  396.     return false; 
  397.    } 
  398.   } 
  399.   return true; 
  400.  } 
  401.  /* 
  402.   * -------------------------------数据库导入end--------------------------------- 
  403.   */ 
  404.  // 关闭数据库连接 
  405.  private function close() { 
  406.   mysql_close ( $this->db ); 
  407.  } 
  408.  // 锁定数据库,以免备份或导入时出错 
  409.  private function lock($tablename$op = "WRITE") { 
  410.   if (mysql_query ( "lock tables " . $tablename . " " . $op )) 
  411.    return true; 
  412.   else 
  413.    return false; 
  414.  } 
  415.  // 解锁 
  416.  private function unlock() { 
  417.   if (mysql_query ( "unlock tables" )) 
  418.    return true; 
  419.   else 
  420.    return false; 
  421.  } 
  422.  // 析构 
  423.  function __destruct() { 
  424.   mysql_query ( "unlock tables"$this->db ); 
  425.   mysql_close ( $this->db ); 
  426.  } 
  427. ?>

Tags: php数据库导出 php导出sql

分享到: