php在pdo方式下对mysql导入导出

<?php 
header("Content-Type:text/html;charset=utf-8"); 
/* 
* 数据库导出调用 
*/ 
$host = '';//主机名 
$dbname = '';//数据库名 
$user = '';//用户名 
$password = '';//密码 
$flag = 1;//1为导出数据苦结构和数据 0为仅导出数据库结构 
//outputSql($host, $dbname, $user, $password, $flag); 
/* 
* 数据库导入调用 
*/ 
//$filename="";//sql文件 
//inputSql($host, $dbname, $user, $password, $filename); 
/* 
* 数据库导出函数outputSql 
* 用PDO方式导出数据库数据 
* $host 主机名 如localhost 
* $dbname 数据库名 
* $user 用户名 
* $password 密码 
* $flag 标志位0或1 0为仅导出数据库结构 1为导出数据库结构和数据 默认为1 
*/ 
function outputSql($host, $dbname, $user, $password, $flag=1) { 
    try { 
        $pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $password);//连接数据库 
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//设置调优参数,遇到错误抛出异常 
    } catch (PDOException $e) { 
        echo $e->getMessage();//如果连接异常则抛出错误信息 
        exit; 
    } 
    $mysql = '';//准备字符串装载导出来的sql语句 
    $statments = $pdo->query("show tables");//返回结果集,show tables检视所有表名 
    foreach ($statments as $value) {//遍历此结果集,导出每个表名对应的信息 
        $table_name = $value[0];//获取该表名 
        $mysql.="DROP TABLE IF EXISTS `$table_name`;\n";//每个表前都准备Drop语句 
        $table_query = $pdo->query("show create table `$table_name`");//取出该表建表信息的结果集 
        $create_sql = $table_query->fetch();//利用fetch方法取出该结果集对应的数组 
        $mysql.=$create_sql['Create Table'] . ";\r\n\r\n";//写入建表信息 
        if ($flag != 0) {//如果标志位不是0则继续取出该表内容生成insert语句 
            $iteams_query = $pdo->query("select * from `$table_name`");//取出该表所有字段结果集 
            $values = "";//准备空字符串装载insert value值 
            $items = "";//准备空字符串装载该表字段名 
            while ($item_query = $iteams_query->fetch(PDO::FETCH_ASSOC)) { //用关联查询方式返回表中字段名和值的数组 
                $item_names = array_keys($item_query);//取出该数组键值 即字段名 
                $item_names = array_map("addslashes", $item_names);//将特殊字符转译加\ 
                $items = join('`,`', $item_names); //联合字段名 如:items1`,`item2 `符号为反引号 键盘1旁边 字段名用反引号括起 
                $item_values = array_values($item_query);//取出该数组值 即字段对应的值 
                $item_values = array_map("addslashes", $item_values);//将特殊字符转译加\ 
                $value_string = join("','", $item_values);//联合值 如:value1','value2 值用单引号括起 
                $value_string = "('" . $value_string . "'),";//值两边加括号 
                $values.="\n" . $value_string;//最后返回给$value 
            } 
            if ($values != "") {//如果$values不为空,即该表有内容 
                //写入insert语句 
                $insert_sql = "INSERT INTO `$table_name` (`$items`) VALUES" . rtrim($values, ",") . ";\n\r"; 
                //将该语句写入$mysql 
                $mysql.=$insert_sql; 
            } 
        } 
        //表间的分割线 
        //$mysql.="-- ---------------------------------------------------\n\r"; 
    } 
    $filename = $dbname . "_" . date('Ymd') . ".sql"; //导出的文件名 
    file_put_contents($filename, $mysql);//导出sql文件 
    echo "数据备份成功,生成备份文件" . $filename; 
} 
/* 
* 数据库导入函数inputSql 
* 用PDO方式导入数据库数据 
* $host 主机名 如localhost 
* $dbname 数据库名 
* $user 用户名 
* $password 密码 
* $filename为导入的文件名 
* 
* 注:用PDO->exec方法一次性导入整个sql文件是可以导入数据库的,但如果某条语句中有错误是无法抛出异常的 
* 所以这里对整个sql文件进行了一次切割,以;作为切割位,切割成单条sql语句(sql文件中注释等部分不影响PDO->exec的执行),逐条调用PDO->exec方法导入,可以方便查错 
*/ 
function inputSql($host, $dbname, $user, $password, $filename) { 
    try { 
        $pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $password);//连接数据库 
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//允许抛出异常 
    } catch (PDOException $e) { 
        echo $e->getMessage();//数据库连接不成功抛出异常 
        exit; 
    } 
    try { 
        if (file_exists($filename)) {//如果文件存在 
            $sql_stream = file_get_contents($filename);//读取整个文件内容 
            $sql_stream = rtrim($sql_stream);//去掉末尾空格 
            //利用正则替换函数,将导入的内容部分,即insert value里的;换成特殊符号' $$$ '为进一步按;切割单条sql语句做准备 
            $new_stream = preg_replace_callback("/\((.*)\)/", create_function('$matches', 'return str_replace(";"," $$$ ",$matches[0]);'), $sql_stream); 
            //切割单条sql语句生成数组 
            $sql_array = explode(";", $new_stream); 
             //遍历该数组 
            foreach ($sql_array as $value) { 
                if (!emptyempty($value)){ //数组最后一个是空数组,所以需要判断一下 
                    $sql = str_replace(" $$$ ", ";", $value) . ";"; //将该条sql语句中' $$$ '转换回; 
                $pdo->exec($sql); //执行该语句 
                echo "成功插入数据:<br/><per>".$sql.";<per/><br/><br/>"; 
                } 
                 
            } 
            echo "导入数据库成功"; 
        } 
    } catch (PDOException $e) { 
        echo $e->getMessage(); //执行异常则抛出异常 
        exit; 
    } 
} 
?>


发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。