<? /* *+----------------------------------------------- ** 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)><<<返回上一页</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" onsubmit="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" onsubmit="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 ); } ?>