mysql 大量数据导入方法[代码]

 

<?  
/* *+-----------------------------------------------
 **  Copyright (c) 2005- **星空公司技术开发部 www.ZGGO.com
    创建人:    GGG  QQ:632519 MNS:gggxin@hotmail.com Email:ggg_w@163.com
    日  期:    2005-4-9 10:25
    描  述:    实现从服务端读取指定数据库文件,然后按行读出SQL语句进行执行.
            主要用于大量数据记录的导入,2M以内的数据请直接采用phpMyAdmin进行导入
            运行后程序会记录下来有错误的sql语句
            注意默认数据库是放在 程序当前路径的 data 目录里的,记得该目录要存在 
    调  用: 直接运行
    备  注:
            程序会自动忽略注解、空行以保证运行不会出错
            我刚试过导入一个 50M的数据库文件。时间在10秒以内 :) 爽~
    版  本:
        1.1
**+-----------------------------------------------
*/


// ***************************** 基本参数配置 *****************************
//**数据库相关配置

     define ( ' DB_HOST ' ,   ' localhost ' );         // 连接数据库的地址
     define ( ' DB_NAME ' ,   ' test ' );             // 数据库库名
     define ( ' DB_USER ' ,   ' root ' );             // 数据库用户名
     define ( ' DB_PASS ' ,   '' );                 // 数据库密码

//**常规参数配置

     define ( ' DBFILE_DIRECTORY ' ,   ' data ' );     // 数据库存放目录  记得该目录要存在
     define ( ' DBFILE_NAME ' ,   ' data.sql ' );     // 要导入的数据库文件名
     define ( ' MSG_LENGTH ' ,   50 );         // 执行后显示每行SQL的前几个字符

//**设置要操作的表单变量名

     $tmpFieldArray   =   array (
    
" DB_HOST " , " DB_NAME " , " DB_USER " , " DB_PASS " , " DBFILE_DIRECTORY " , " DBFILE_NAME " , " MSG_LENGTH "
    );

// !!!!!!!!!!!!!!!!!!!!!!!!!!!!! 基本参数配置 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//$_SESSION['DB_HOST']="DB_HOST";
//$_SESSION['MSG_LENGTH']="MSG_LENGTH";
//print($_SESSION['DB_HOST']);
//die();

session_start ();
if ( empty ( $_POST [ " command " ]))
    
$_POST [ " command " ] = "" ;
if ( $_POST [ " command " ] == " submit " )     // *********************** 提交表单
{
    
set_time_limit ( 0 );  // 设定该页最久执行时间。
     $BeginTime = getmicrotime();         // 记录程序刚运行的开始时间,微秒

//** 得到表单提交过来的变量

     foreach ( $tmpFieldArray    as   $key   =>   $value )
    {
        $
$value = trim ( $_POST [ $value ]);     // 得到提交过来的表单变量
         if ( empty ($ $value ))                 // 如果没有设置过表变量
        {
            $
$value = constant ( $value );     // 采用参数配置里的值
        }
        
if ( $_POST [ " ISSAVECONFIG " ])         // 保存配置信息
             $_SESSION [ $value ] = $ $value ;
        
else
            
$_SESSION [ $value ] = "" ;
    }
    
if ( empty ( $_POST [ " ISSHOWDEBUG " ]))
    {
        
$_POST [ " ISSHOWDEBUG " ] = 0 ;
    }
// die();
     if ( ! ereg ( " ^[0-9]+$ " , $MSG_LENGTH ))     // 执行后显示每行SQL的前几个字符 不是数字
         $MSG_LENGTH = constant ( " MSG_LENGTH " );
// 变量设置
     $DBLINK_ID = "" ;             // 数据库链接ID
     $ErrorSqlArray = array ();     // 保存出错的sql记录
     $RecordCnt = 0 ;             // 统计记录数


//***************************** 连接到数据库 *****************************

     $DBLINK_ID = mysql_connect ( $DB_HOST , $DB_USER , $DB_PASS );
    
if  ( ! $DBLINK_ID )
    {
        ggghalt(
" 连接数据库出错,请正确填写MYSQL配置参数 " );
    }

    
if ( ! mysql_select_db ( $DB_NAME ,   $DBLINK_ID ))
    {
        ggghalt(
" 选择数据库库名 [ " . $DB_NAME . " ] 出错,请正确填写 数据库库名 " );
    }

// !!!!!!!!!!!!!!!!!!!!!!!!!!!!! 连接到数据库 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    
$error_msg = "" ;         // 错误代码
//***************************** 对目录、文件进行检查 *****************************
//** 检查目录

     if strlen ( $DBFILE_DIRECTORY ) > 20   ||   strlen ( $DBFILE_DIRECTORY ) < 3   ||   ! eregi ( " ^[0-9a-z_]+$ " , $DBFILE_DIRECTORY ))
    {        
    ggghalt(
" <br>数据库存放目录[ " . $DBFILE_DIRECTORY . " ]名称不合法!<br>3-20个字符,可以为英文小写,数字,下划线 " );    
    }
    
if  ( ! is_dir ( $DBFILE_DIRECTORY ))
    {
        ggghalt(
" 数据库存放目录 [ " . $DBFILE_DIRECTORY . " ] 不存在 " );
    }
// ** 检查文件
     if strlen ( $DBFILE_DIRECTORY ) > 50   ||   strlen ( $DBFILE_DIRECTORY ) < 3   ||   ! eregi ( " ^[0-9a-z_]+$ " , $DBFILE_DIRECTORY ))
    {
        ggghalt(
" 要导入的数据库文件名 [ " . $DBFILE_NAME . " ] 名称不合法!<br>3-50个字符,可以为英文小写,数字,下划线 " );    

    }
    
if  ( ! file_exists ( $DBFILE_DIRECTORY . " / " . $DBFILE_NAME ))
    {
        ggghalt(
" [ " . $DBFILE_DIRECTORY . " ] 目录下不存在 要导入的数据库文件名[ " . $DBFILE_NAME . " ] " );
    }
    
if  ( ! is_readable ( $DBFILE_DIRECTORY . " / " . $DBFILE_NAME ))
    {
        ggghalt(
$DBFILE_DIRECTORY . " 目录下要导入的数据库文件名[ " . $DBFILE_NAME . " ] 不可读 " );
    }

// !!!!!!!!!!!!!!!!!!!!!!!!!!!!! 对目录、文件进行验证 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!

//** 打开文件进行读操作

     $fphandle   =   fopen  ( $DBFILE_DIRECTORY . " / " . $DBFILE_NAME ,   " r " );
    
if  ( ! $fphandle )
    {
        ggghalt(
" 打开 [ " . $DBFILE_DIRECTORY . " ] 目录下要导入的数据库文件名[ " . $DBFILE_NAME . " ] 出错! " );
    }
    
$query_id = "" ;
    
$headSqlStr = "" ;     // 保存每行的头几个字符
     echo   " <textarea name=sqldump cols=80 rows=20 id=textSQLDUMP wrap=OFF> " ;
    
print ( " --- sql 列表 " ); 

// ** 读取文件每一行数据
     while  ( ! feof  ( $fphandle ))
    {
        
$query_string = "" ;
        
$query_string   =   trim ( fgets ( $fphandle ));     // 读出每一行 有可能末行还有个回车。先去除
//        substr(&$query_string,0,5)
//        echo "<br>".$buffer;

         $headSqlStr = trim ( substr ( & $query_string , 0 , $MSG_LENGTH ));
        
// 空行或sql命令不对的直接跳过
         if ( empty ( $headSqlStr ||   ! eregi ( " ^[0-9a-z ]+$ " , substr ( $headSqlStr , 0 , 5 )))
            
continue ;
        
if ( $_POST [ " ISSHOWDEBUG " ] == 1 )                 // 显示运行时的信息 
        {
            
echo   $headSqlStr ;
            
echo   " " ;
        }
        
$RecordCnt ++ ;
        
$query_id   =   mysql_query ( $query_string , $DBLINK_ID );
        
if  ( ! $query_id )
        {
            
$ErrorSqlArray [] = mysql_error () . " " . $headSqlStr ;
        }
// */
        //mysql_query($query); 

    }
    
fclose  ( $fphandle );
    
mysql_close ( $DBLINK_ID );
    
$errorCnt = count ( $ErrorSqlArray );     // 得到出错的记录条数
     print ( " --- 总共  " . $RecordCnt . "  条记录 " ); 
    
print ( "   运行失败的有  " . $errorCnt . "  条记录 " ); 
    
if ( $errorCnt > 0 )
    {
        
print ( " --- 以下显示运行失败的SQL语句 " );
        
for ( $tmpi = 0 ; $tmpi < $errorCnt ; $tmpi ++ )
        {
            
print ( $ErrorSqlArray [ $tmpi ]);
            
echo   " " ;
        }
    }
    
$passTime = getmicrotime() - $BeginTime ;         // 记录程序刚运行的开始时间,微秒

    
echo   " </textarea > " ;
    
print ( " <br>总共 <b> " . $RecordCnt . " </b> 条记录<br>运行时间  " . $passTime . "  微秒<br> " ); 
    
print ( " 运行失败的有 <b><font color=#ff0000> " . $errorCnt . " </font></b> 条记录<br> " ); 

echo   " <script language=javascript>alert("操作完成/n总共  " . $RecordCnt . "  条记录/n运行失败的有  " . $errorCnt . "  条记录/n运行时间  " . $passTime . "  微秒");</script><a title=返回上一页 href=javascript:history.go(-1)>&lt;&lt;&lt;返回上一页</a>
" ;


}
// ***************************** 显示表单界面 *****************************
else     
{
// ** 得到保存在 session 里的变量
     foreach ( $tmpFieldArray    as   $key   =>   $value )
    {
        
if ( empty ( $_SESSION [ $value ]))                 // 如果没有设置过表变量
        {
            $
$value = constant ( $value );                 // 采用参数配置里的值
        }
        
else
        {
            $
$value = $_SESSION [ $value ];     // 采用 _SESSION 里的值
        }
    }

?>


< html >
< head >
< title > 闪电大型数据库导入程序 </ title >
< meta http - equiv = " Content-Type "  content = " text/html; charset=gb2312 " >
< style type = " text/css " >
<!--

. tb_frame
{
    border
- top :  1px solid  # 000000;
    border - left :  1px solid  # 000000;
    border - right :  1px solid  # 000000;
    border - bottom :  1px solid  # 000000;
    background - image : url();    
    background
- color : ;        
    height
: ;                
    width
: 75 % ;                
    text
- align : ;            
    line
- height : ;            
    font
- size :  ; 
    color
:  12px;
}
. tb_tr
{
    background
- color : # 6891D2;        
    font - size : 12px ; 
    color
: # ffffff;
}

. tb_head_font{font - weight : ;font - size : 9pt;COLOR : # 6883C3;}                /*标题字体*/

-->
</ style >
</ head >

< body bgcolor = " #FFFFFF "  text = " #000000 " >
  
< form name = " form1 "  method = " post "  action = " <?echo $HTTP_SERVER_VARS[ " PHP_SELF " ]?> "  onsubmit = " return CheckForm(this) " >
  
< table  border = " 0 "  align = " center "   class = tb_frame  >
    
< tr >  
      
< td colspan = " 2 "  align = " center " >< b > MYSQL数据库导入程序  </ b >  by  < a href = http : // ZGGO.com>ZGGO.com</a></td>
     </ tr >
  
</ table ></ br >
  
< table  border = " 0 "  align = " center "   class = tb_frame >
    
< tr  class = tb_tr >  
      
< td colspan = " 2 " >  常规参数配置  
        
< input type = " checkbox "  name = " ISSAVECONFIG "  value = " 1 "  checked >
        
< i > [ISSAVECONFIG]是否保存配置信息 </ i >

< input type = " checkbox "  name = " ISSHOWDEBUG "  value = " 1 "   >
        
< i > [ISSHOWDEBUG]是否显示运行信息 </ i >   不打钩可以加快运行速度

        
</ td >
    
</ tr >
    
< tr >  
      
< td > [DBFILE_DIRECTORY]数据库存放目录 </ td >
      
< td >  
        
< input type = " text "  name = " DBFILE_DIRECTORY "  value = " <?echo $DBFILE_DIRECTORY;?> "  check = " ^[0-9a-z_-]{3,20}$ "  warning = " 数据库存放目录3-20个字符,可以为英文小写,数字,下划线 " > 不支持二级目录 .
      
</ td >
    
</ tr >
    
< tr >  
      
< td > [DBFILE_NAME]要导入的数据库文件名 </ td >
      
< td >  
        
< input type = " text "  name = " DBFILE_NAME "  
        value
= " <?echo $DBFILE_NAME;?> "  check = " ^[.0-9a-z_-]{3,50}$ "  warning = " 数据库文件名3-50个字符,可以为英文小写,数字,下划线,点 " >

      
</ td >
    
</ tr >
    
< tr >  
      
< td > [MSG_LENGTH]执行后显示每行SQL的前几个字符 </ td >
      
< td >  
        
< input type = " text "  name = " MSG_LENGTH "   size = " 5 "  maxlength = " 4 "   value = " <?echo $MSG_LENGTH;?> "  check = " ^d+$ "  warning = " 每行SQL的前几个字符请用纯数据 " >
      
</ td >
    
</ tr >
    
< tr align = " center " >  
      
< td colspan = " 2 " >  
        
< input type = " submit "  name = " vSubmit "  value = " 提交 " >
        
< input type = " reset "  name = " Submit "  value = " 重设 " >
        
< input type = " hidden "  name = " command "  value = " submit " >
      
</ td >
    
</ tr >
  
</ table ></ br >
  
< table  border = " 0 "  align = " center "   class = tb_frame >
    
< tr  class = tb_tr >  
      
< td colspan = " 2 " >  数据库连接参数配置   </ td >
    
</ tr >
    
< tr >  
      
< td > [DB_HOST]MYSQL服务器名 </ td >
      
< td >  
        
< input type = " text "  name = " DB_HOST "  value = " localhost " >
      
</ td >
    
</ tr >
    
< tr >  
      
< td > [DB_NAME]数据库库名 </ td >
      
< td >  
        
< input type = " text "  name = " DB_NAME "  value = " <?echo $DB_NAME;?> "   check = " ^[0-9a-z_-]{3,15}$ "  warning = " 数据库库名3-15个字符,可以为英文小写,数字,下划线 " >
      
</ td >
    
</ tr >
    
< tr >  
      
< td > [DB_USER]数据库用户名 </ td >
      
< td >  
        
< input type = " text "  name = " DB_USER "   value = " <?echo $DB_USER;?> "    check = " S{1,} "  warning = " 数据库用户名不能为空 " >
      
</ td >
    
</ tr >
    
< tr >  
      
< td > [DB_PASS]数据库密码 </ td >
      
< td >  
        
< input type = " password "  name = " DB_PASS "  value = " <?echo $DB_PASS;?> "   >
      
</ td >
    
</ tr >
  
</ table ></ br >
  
< table  border = " 0 "  align = " center "   class = tb_frame >
    
< tr >  
      
< td >< font color = red > 注意说明 </ font >:< br >
        
1 、数据库记录请先用phpMyAdmin(尽量用高版本)导出 , 导出时 < i >< b > 不要包括表结构 </ b ></ i > < br >
        
2 、确保导出的记录的INSERT INTO 语句每行是完整的一条 , 语句中间不能出现换行。 < br >
        
< font color = " #FFFFFF " > aaaa </ font > ( 因为程序是采用每读一行 , 再执行读出sql语句的方式 . < br >
        
3 、把用phpMyAdmin导出的数据库文件上传到 [DBFILE_DIRECTORY]数据库存放目录 < br >
      
</ td >
    
</ tr >
  
</ table ></ br >
</ form >
</ body >
</ html >
<?
// ***************************** 以下为客户端表单通用验证程序 *****************************
//***************************** 以下为客户端表单通用验证程序 *****************************
//***************************** 以下为客户端表单通用验证程序 *****************************

?>  

< script language = javascript >
/*
 *--------------- 客户端表单通用验证CheckForm(oForm) -----------------
 * 功能:通用验证所有的表单元素.
 * 使用:
 *    <form name="form1" οnsubmit="return CheckForm(this)">
 *    <input type="text" name="id" check="^S+$" warning="id不能为空,且不能含有空格">
 *    <input type="submit">
 *    </form>
 * author:wanghr100(灰豆宝宝.net)
 * email:wanghr100@126.com
 * update:19:28 2004-8-23
 * 注意:写正则表达式时一定要小心.不要让"有心人"有空子钻.
 * 已实现功能:
 * 对text,password,hidden,file,textarea,select,radio,checkbox进行合法性验证
 * 待实现功能:把正则表式写成个库.
 *--------------- 客户端表单通用验证CheckForm(oForm) -----------------
 
*/
// //

//主函数

function  CheckForm(oForm)
{
    
var  els  =  oForm . elements;
    
// 遍历所有表元素
     for ( var  i = 0 ;i < els . length;i ++ )
    {
        
// 是否需要验证
         if (els[i] . check)
        {
            
// 取得验证的正则字符串
             var  sReg  =  els[i] . check;
            
// 取得表单的值,用通用取值函数
             var  sVal  =  GetValue(els[i]);
            
// 字符串->正则表达式,不区分大小写
             var  reg  =   new  RegExp(sReg , " i " );
            
if ( ! reg . test(sVal))
            {
                
// 验证不通过,弹出提示warning
                alert(els[i] . warning);
                
// 该表单元素取得焦点,用通用返回函数
                GoBack(els[i])  
                
return   false ;
            }
        }
    }
    
return   true ;
}

// 通用取值函数分三类进行取值
//文本输入框,直接取值el.value
//单多选,遍历所有选项取得被选中的个数返回结果"00"表示选中两个
//单多下拉菜单,遍历所有选项取得被选中的个数返回结果"0"表示选中一个

function  GetValue(el)
{
    
// 取得表单元素的类型
     var  sType  =  el . type;
    
switch (sType)
    {
        
case   " text " :
        
case   " hidden " :
        
case   " password " :
        
case   " file " :
        
case   " textarea " :   return  el . value;
        
case   " checkbox " :
        
case   " radio " :   return  GetValueChoose(el);
        
case   " select-one " :
        
case   " select-multiple " :   return  GetValueSel(el);
    }
    
// 取得radio,checkbox的选中数,用"0"来表示选中的个数,我们写正则的时候就可以通过0{1,}来表示选中个数
     function  GetValueChoose(el)
    {
        
var  sValue  =   "" ;
        
// 取得第一个元素的name,搜索这个元素组
         var  tmpels  =  document . getElementsByName(el . name);
        
for ( var  i = 0 ;i < tmpels . length;i ++ )
        {
            
if (tmpels[i] . checked)
            {
                sValue 
+=   " 0 " ;
            }
        }
        
return  sValue;
    }
    
// 取得select的选中数,用"0"来表示选中的个数,我们写正则的时候就可以通过0{1,}来表示选中个数
     function  GetValueSel(el)
    {
        
var  sValue  =   "" ;
        
for ( var  i = 0 ;i < el . options . length;i ++ )
        {
            
// 单选下拉框提示选项设置为value=""
             if (el . options[i] . selected  &&  el . options[i] . value != "" )
            {
                sValue 
+=   " 0 " ;
            }
        }
        
return  sValue;
    }
}

// 通用返回函数,验证没通过返回的效果.分三类进行取值
//文本输入框,光标定位在文本输入框的末尾
//单多选,第一选项取得焦点
//单多下拉菜单,取得焦点

function  GoBack(el)
{
    
// 取得表单元素的类型
     var  sType  =  el . type;
    
switch (sType)
    {
        
case   " text " :
        
case   " hidden " :
        
case   " password " :
        
case   " file " :
        
case   " textarea " :  el . focus(); var  rng  =  el . createTextRange(); rng . collapse( false ); rng . select();
        
case   " checkbox " :
        
case   " radio " :   var  els  =  document . getElementsByName(el . name);els[ 0 ] . focus();
        
case   " select-one " :
        
case   " select-multiple " : el . focus();
    }
}

/*
通用表单函数测试:
<form name="form1" οnsubmit="return CheckForm(this)">
test:<input type="text" name="test">不验证<br>
账号:<input type="text" check="^S+$" warning="账号不能为空,且不能含有空格" name="id">不能为空<br>
密码:<input type="password" check="S{6,}" warning="密码六位以上" name="id">六位以上<br>
电话:<input type="text" check="^d+$" warning="电话号码含有非法字符" name="number" value=""><br>
相片上传:<input type="file" check="(.*)(.jpg|.bmp)$" warning="相片应该为JPG,BMP格式的" name="pic" value="1"><br>
出生日期:<input type="text" check="^d{4}-d{1,2}-d{1,2}$" warning="日期格式2004-08-10"  name="dt" value="">日期格式2004-08-10<br>
省份:
<select name="sel" check="^0$" warning="请选择所在省份">
<option value="">请选择
<option value="1">福建省
<option value="2">湖北省
</select>
<br>
选择你喜欢的运动:<br>
游泳<input type="checkbox" name="c" check="^0{2,}$" warning="请选择2项或以上">
篮球<input type="checkbox" name="c">
足球<input type="checkbox" name="c">
排球<input type="checkbox" name="c">
<br>
你的学历:
大学<input type="radio" name="r" check="^0$" warning="请选择一项学历">
中学<input type="radio" name="r">
小学<input type="radio" name="r">
<br>
个人介绍:
<textarea name="txts" check="^[s|S]{20,}$" warning="个人介绍不能为空,且不少于20字"></textarea>20个字以上
<input type="submit">
</form>

*/

</ script >




<?
}
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!! 显示表单界面 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!


//****简单函的定义

function  ggghalt( $msg // 退出系统
{
    
global   $DBLINK_ID ;     // 数据库链接ID
//    $errdesc=mysql_error();
//    $errno=mysql_errno();

     print ( $msg );
    
mysql_close ( $DBLINK_ID );
    
die ();
}
// ************* 得到当前时间 微秒
function  getmicrotime()
{
    
list ( $usec ,   $sec =   explode ( "   " , microtime ()); 
    
return  (( float ) $usec   +  ( float ) $sec ); 
}
?>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值