PHP导出sql文件

发现自己之前写的php导出sql数据为Excel文件在导出一些数据的时候出现了精度的问题,比如导出身份证号的时候会把后面变成0000。暂时先把这个问题留下,有空去看看到底是什么问题。

写了一个导出sql的工具。稍微加了下界面,把功能也做多了点,简单来说,就是三个功能:

  1.直接在浏览器上显示sql文件内容。

  2.直接导出到服务器上,要求目录要可写。

  3.直接下载到本地,脱库时感觉还不错。

好了直接贴上代码:

sqldump.php

<?php
    if (isset($_REQUEST['option'])) {
        define('DOWNLOAD', $_REQUEST['option']);
    }else{
        define('DOWNLOAD',0);//0代表直接显示,1代表下载,2代表导出在本地
    }
    if (DOWNLOAD != 1) {
        header("Content-type:text/html;charset=utf-8");
    }
    $cfg_dbhost ='localhost';
    $cfg_dbname ='mysql';
    $cfg_dbuser ='root';
    $cfg_dbpwd ='';
    $cfg_db_language ='utf8';

    //配置信息
    $cfg_dbhost = isset($_REQUEST['dbhost'])?$_REQUEST['dbhost']:$cfg_dbhost;
    $cfg_dbname = isset($_REQUEST['dbname'])?$_REQUEST['dbname']:$cfg_dbname;
    $cfg_dbuser = isset($_REQUEST['dbuser'])?$_REQUEST['dbuser']:$cfg_dbuser;
    $cfg_dbpwd = isset($_REQUEST['dbpwd'])?$_REQUEST['dbpwd']:$cfg_dbpwd;
    $cfg_db_language = isset($_REQUEST['dbc'])?$_REQUEST['dbc']:$cfg_db_language;
    
    $to_file_name =isset($_REQUEST['dbtable'])?$_REQUEST['dbtable'].".sql":$cfg_dbname.".sql";

    if (DOWNLOAD==2) {
        $to_file_name =isset($_REQUEST['dbtable'])?dirname(__FILE__).DIRECTORY_SEPARATOR.$_REQUEST['dbtable'].".sql":dirname(__FILE__).DIRECTORY_SEPARATOR.$cfg_dbname.".sql";
    }
    // END 配置

    //链接数据库
    $link = @mysql_connect($cfg_dbhost,$cfg_dbuser,$cfg_dbpwd);
    $link==null?die('mysql connect error'):'';
    @mysql_select_db($cfg_dbname);
    //选择编码
    @mysql_query("set names ".$cfg_db_language);
    //数据库中有哪些表
    $tabList = isset($_REQUEST['dbtable'])?array("{$_REQUEST['dbtable']}"):list_tables($cfg_dbname);
    $tabList==null?die('no tables found'):'';
    if (DOWNLOAD==1) {
        Header("Content-type: application/octet-stream");
        Header("Accept-Ranges: bytes");
        Header("Content-Disposition: attachment; filename=".$to_file_name);
    }
    if (DOWNLOAD==2) {
        echo "正在导出...<hr/>";
    }
    $info = "-- ----------------------------\r\n";
    $info .= "-- 备份日期:".date("Y-m-d H:i:s",time())."\r\n";
    $info .= "-- ----------------------------\r\n\r\n";
    if (DOWNLOAD==2) {
        file_put_contents($to_file_name,$info,FILE_APPEND);
    }else{
        echo $info;
    }
    //将每个表的表结构导出到文件
    foreach($tabList as $val){
        $sql = "show create table ".$val;
        $res = @mysql_query($sql,$link);
        if ($res==null) {
            die('table `'.$val.'` not EXISTS');
        }
        $row = @mysql_fetch_array($res);
        $info = "-- ----------------------------\r\n";
        $info .= "-- Table structure for `".$val."`\r\n";
        $info .= "-- ----------------------------\r\n";
        $info .= "DROP TABLE IF EXISTS `".$val."`;\r\n";
        $sqlStr = $info.$row[1].";\r\n\r\n";
        if (DOWNLOAD==2) {
            //追加到文件
            file_put_contents($to_file_name,$sqlStr,FILE_APPEND);
        }else{
            echo $sqlStr;
        }
        //释放资源
        @mysql_free_result($res);
    }

    //将每个表的数据导出到文件
    foreach($tabList as $val){
        if(DOWNLOAD==2){
            echo "正在导出表`".$val."`...<br>";
        }
        $sql = "select * from ".$val;
        $res = @mysql_query($sql,$link);
        //如果表中没有数据,则继续下一张表
        if(@mysql_num_rows($res)<1) continue;
        //
        $info = "-- ----------------------------\r\n";
        $info .= "-- Records for `".$val."`\r\n";
        $info .= "-- ----------------------------\r\n";
        if (DOWNLOAD==2) {
            file_put_contents($to_file_name,$info,FILE_APPEND);
        }else{
            echo $info;
        }
        //读取数据
        while($row = @mysql_fetch_row($res)){
            $sqlStr = "INSERT INTO `".$val."` VALUES (";
            foreach($row as $zd){
                $sqlStr .= "'".$zd."', ";
            }
            //去掉最后一个逗号和空格
            $sqlStr = substr($sqlStr,0,strlen($sqlStr)-2);
            $sqlStr .= ");\r\n";
            if (DOWNLOAD==2) {
                file_put_contents($to_file_name,$sqlStr,FILE_APPEND);
            }else{
                echo $sqlStr;
            }
        }
        //释放资源
        @mysql_free_result($res);
        if (DOWNLOAD==2) {
            file_put_contents($to_file_name,"\r\n",FILE_APPEND);
        }else{
            echo "\r\n";
        }
    }
    if(DOWNLOAD==2){
        echo "<hr/>导出成功。";
    }
//    echo "End!";
    function list_tables($database)
    {
        $sql='SHOW TABLES FROM '.$database;
        $rs = mysql_query($sql);
        $tables = array();
        while ($row = mysql_fetch_row($rs)) {
            $tables[] = $row[0];
        }
        mysql_free_result($rs);
        return $tables;
    }

?>

然后是界面的东西了,为的是不让自己去记这个烦人的参数。

sqldumpclient.html

<html>
<head>
<title>sqldump客户端</title>
<meta charset='utf-8'>
<script type="text/javascript">
    function setaction () {
        $('cform').action=$('act').value;
        inputs=document.getElementsByTagName('input');
        for(var i =1;i<inputs.length-4;i++){
            if (inputs[i].value!='') {
                inputs[i].name=inputs[i].id;
            }
        }

    }
    function $(id){
        return document.getElementById(id);
    }
</script>
</head>
<body>
<center>    
<h1 align="center">PHP sql dump</h1>
<h3 align="right">Author:Medici.Yan@gmail.com</h3>
    <form method="post"  onsubmit="setaction()">
            <fieldset>
            <table>
                <legend>配置</legend>
                <tr>
                <td><label for="act">脚本地址:</label></td>
                <td><input type="text"  placeholder="http://www.example.com/sqldump.php"/></td>
                <td rowspan="7" width="100">使用方法:把sqldump.php传到服务器上,然后在这里填写相关参数,也可以直接访问脚本</td>
                </tr>
                <tr>
                <td><label for="dbhost">数据库地址:</label></td>
                <td><input type="text"  placeholder="默认:localhost"/></td>
                </tr>
                <tr>
                <td><label for="dbname">数据库名:</label></td>
                <td><input type="text"  placeholder="默认:mysql"/></td>
                </tr>
                <tr>
                <td><label for="dbuser">用户名:</label></td>
                <td><input type="text"  placeholder="默认:root"/></td>
                </tr>
                <tr>
                <td><label for="dbpwd">密码:</label></td>
                <td><input type="text"  placeholder="默认:<empty>"/></td>
                </tr>
                <tr>
                <td><label for="dbc">字符集:</label></td>
                    <td>
                    <input list="charlist"  placeholder="默认:utf8" />
                        <datalist >
                            <option value="utf8" />
                            <option value="gbk" />
                            <option value="gb2312" />
                        </datalist>    
                    </td>
                </tr>
                <tr>
                <td><label for="dbtable">表名:</label></td>
                <td><input type="text"  placeholder="为空代表所有表"/></td>
                </tr>
                <tr>
                <td><label for="option">导出方式:</label></td>
                <td>
                <input type="radio"  name="option" value="0" checked="checked">浏览器显示
                <input type="radio"  name="option" value="1">下载到本地
                <input type="radio"  name="option" value="2">导出至服务器
                </td>
                </tr>
                <tr>
                <td><input type="submit" value="开始" /></td>
                </tr>
                </table>
            </fieldset>
    </form>
</center>
</body>
</html>

用法也很简单,把sqldump.php传到服务器上,然后在本地运行sqldumpclient.html,写上相关参数就OK。