<?
/*
*+-----------------------------------------------
** 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
);
}
?>
265

被折叠的 条评论
为什么被折叠?



