to ice_berg16(寻梦的稻草人)对方的要求是必须能实现这样的功能:不单是查询到某个人当月的工资,还要能看到前几个月的工资信息。这样的话,工资数据表就不能按照月份每个月一个表,否则查询下个月的工资信息就会很大的麻烦了!!但是我以前load data的时候发现是不能追加数据的,mysqlimport则可以,但偏偏不能远程操作…… 还有的就是既然表不能按照月份每个月一个表,那就意味着每个月传上去的文本,导完后都要删除,这个删除权限恐怕就很麻烦了毕竟服务器是网络分局专管的,他们才是整个单位网络的管理员。
1 数据库超过一定尺寸,比如6M 这时使用导出一般没问题,可以正确的保存到本机硬盘上面,但是导入则不行!原因是:一般的 PHP.INI 里面设置临时文件/上传文件的大小限制为2M,而phpmyadmin使用了上传的方式,造成失败。 2 导出到硬盘的 .SQL 文件在导回时,经常出现由于某些单引号的问题引起失败,造成导入失败,只能用 mysql等应用程序导入了。 我的数据库已经超过10M,所以必须解决这个问题。我的思路: 导出: 用phpmyadmin 保存数据库/表格结构,用脚本读取数据库内容并保存到文件里面!
导入: 用phpmyadmin 恢复数据库/表格结构,用脚本读取文件,然后保存到库里面! 导出程序如下:调用方法为 ****.php?table=tablename
这个简单的程序目前一次保存一个表格!!每行为一个字段的数据!!
< ?
if($table=="")exit();
mysql_connect("localhost","name","password");
mysql_select_db("database");
$result = mysql_query("select * from $table");
if(mysql_num_rows($result) < = 0) exit();
echo "开始转换数据到文本...
";
$handle = fopen("$table.txt","w");
$numfields = mysql_num_fields($result);
fputs($handle,$numfields."\r\n");
for($k=0;$k< mysql_num_rows($result);$k++)
{
$msg = mysql_fetch_row($result);
for($i=0;$i< $numfields;$i++)
{
$msg[$i] = str_replace("\r\n","&&php2000mysqlreturn&&",$msg[$i]);
$msg[$i] = str_replace("\n" ,"&&php2000mysqlreturn&&",$msg[$i]);
fputs($handle,$msg[$i]."\r\n");
}
fputs($handle,"------- php2000 dump data program V1.0 for MySQL --------\r\n");
}
fclose($handle);
echo "ok";
?> 导入的程序如下:用法同上面!
< ?
if($table=="")exit();
mysql_connect("localhost","name","password");
mysql_select_db("database");
$message = file("$table.txt");
echo $numfields = chop($message[0]);
for($k=1;$k< count($message);$k+=($numfields+1))
{
$value="";
for ($i=$k;$i< ($k+$numfields-1);$i++)
{
$tmp = str_replace("&&php2000mysqlreturn&&","\r\n",chop($message[$i]));
$value .= "'".addslashes($tmp)."',";
}
$tmp = str_replace("&&php2000mysqlreturn&&","\r\n",chop($message[$k+$numfields-1]));
$value .= "'".$tmp."'";
$query = "insert into $table values (".$value.")";
echo mysql_error();
mysql_query($query);
echo $k." ";
}
echo "ok";
?> 使用方法和可能的问题!
1 导入时 file()函数可能会有问题(我的10M的数据没出现问题),可以改为 fopen()然后没次读一行!!
2 导入,导出都需要用 ftp 操作,也就是导出后,用 ftp 把数据转到本机,导入时先用ftp转移数据到服务器!
第二用工具:出要用到MySQL的mysqldump工具,基本用法是:
shell> mysqldump [OPTIONS] database [tables]
如果你不给定任何表,整个数据库将被导出。
通过执行mysqldump --help,你能得到你mysqldump的版本支持的选项表。
注意,如果你运行mysqldump没有--quick或--opt选项,mysqldump将在导出结果前装载整个结果集到内存中,如果你正在导出一个大的数据库,这将可能是一个问题。
mysqldump支持下列选项:
--add-locks
在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE。(为了使得更快地插入到MySQL)。
--add-drop-table
在每个create语句之前增加一个drop table。
--allow-keywords
允许创建是关键词的列名字。这由表名前缀于每个列名做到。
-c, --complete-insert
使用完整的insert语句(用列名字)。
-C, --compress
如果客户和服务器均支持压缩,压缩两者间所有的信息。
--delayed
用INSERT DELAYED命令插入行。
-e, --extended-insert
使用全新多行INSERT语法。(给出更紧缩并且更快的插入语句)
-#, --debug[=option_string]
跟踪程序的使用(为了调试)。
--help
显示一条帮助消息并且退出。
--fields-terminated-by=...
--fields-enclosed-by=...
--fields-optionally-enclosed-by=...
--fields-escaped-by=...
--fields-terminated-by=...
这些选择与-T选择一起使用,并且有相应的LOAD DATA INFILE子句相同的含义。
LOAD DATA INFILE语法。
-F, --flush-logs
在开始导出前,洗掉在MySQL服务器中的日志文件。
-f, --force,
即使我们在一个表导出期间得到一个SQL错误,继续。
-h, --host=..
从命名的主机上的MySQL服务器导出数据。缺省主机是localhost。
-l, --lock-tables.
为开始导出锁定所有表。
-t, --no-create-info
不写入表创建信息(CREATE TABLE语句)
-d, --no-data
不写入表的任何行信息。如果你只想得到一个表的结构的导出,这是很有用的!
--opt
同--quick --add-drop-table --add-locks --extended-insert --lock-tables。
应该给你为读入一个MySQL服务器的尽可能最快的导出。
-pyour_pass, --password[=your_pass] 与服务器连接时使用的口令。如果你不指定“=your_pass”部分,mysqldump需要来自终端的口令。
-P port_num, --port=port_num
与一台主机连接时使用的TCP/IP端口号。(这用于连接到localhost以外的主机,因为它使用 Unix套接字。)
-q, --quick
不缓冲查询,直接导出至stdout;使用mysql_use_result()做它。
-S /path/to/socket, --socket=/path/to/socket
与localhost连接时(它是缺省主机)使用的套接字文件。
-T, --tab=path-to-some-directory
对于每个给定的表,创建一个table_name.sql文件,它包含SQL CREATE 命令,和一个table_name.txt文件,它包含数据。 注意:这只有在mysqldump运行在mysqld守护进程运行的同一台机器上的时候才工作。.txt文件的格式根据--fields-xxx和--lines--xxx选项来定。
-u user_name, --user=user_name
与服务器连接时,MySQL使用的用户名。缺省值是你的Unix登录名。
-O var=option, --set-variable var=option设置一个变量的值。可能的变量被列在下面。
-v, --verbose
冗长模式。打印出程序所做的更多的信息。
-V, --version
打印版本信息并且退出。
-w, --where='where-condition'
只导出被选择了的记录;注意引号是强制的!
"--where=user='jimf'" "-wuserid>1" "-wuserid<1"
最常见的mysqldump使用可能制作整个数据库的一个备份:
mysqldump --opt database > backup-file.sql
但是它对用来自于一个数据库的信息充实另外一个MySQL数据库也是有用的:
mysqldump --opt database | mysql --host=remote-host -C database
由于mysqldump导出的是完整的SQL语句,所以用mysql客户程序很容易就能把数据导入了:
shell> mysqladmin create target_db_name
shell> mysql target_db_name < backup-file.sql
读取你原来的数据库数据,
生成一个PHP文件,写入PHP的insert语句,然后放到PHP目录下执行,一次就搞定了!
交给他们的时候才发现有一个很大的问题是:要我开发的是人事部,而工资数据库也由他们掌握,偏偏他们对电脑的掌握就是。
特别是做成后的数据导入问题遇到了很大的麻烦:
服务器是在网络分局掌管,跟人事部门至少几公里以外!所以上面很多朋友说的导入方法都会有这个很现实的问题:文本在本地但是服务器在远程!!!
还有一个最为气人的是:那些王八蛋根本不知道服务器是什么操作系统却要我基于win*垃圾平台来做!!!其实后来我在**分局的机房上班的时候才了解到单位的大型主机用的是unix+oracle
而且网络分局那边的服务器也极有可能是使用unix!!
那些王八害苦我了,起初我还以为他们人事部自己用的机器(win)做服务!!现在觉得还是直接读取文本,然后生成sql语句再导入数据库才能解决。。
但是这种做法我不熟悉,那位有经验的可以说说?
谢谢!
既然文件格式以制表符分开,回车换行,可以用MYSQL的语句导入
如果服务器在远程,可以以WEB界面的形式提供给用户,让用户选择文本文件上传到服务器
然后服务器使用PHP来导入
mysql_query("load data infile 'test.txt' into table yourtblname");
那有什么问题?
我以前是用file()或者fopen()函数打开.
然后用分割符号分割,接着插入数据库.
还有的就是既然表不能按照月份每个月一个表,那就意味着每个月传上去的文本,导完后都要删除,这个删除权限恐怕就很麻烦了毕竟服务器是网络分局专管的,他们才是整个单位网络的管理员。
虽然已经实现,但是依然面临不能追加的问题!!
真是急刹人了,因为工资表无论是那个月,帐户总是相同(每个人一个帐户,这是主键),正是如此,后面的工资数据无法追加。
如果工资表按照每个月一张表的做法的话,又是面临查询困难的问题!
因为按照要求,当职工或者管理员查询某个人的各个月份的工资的时候,表的选择就是个很大的问题了!!!
比如现在是7月,现在写好的程序查询包括7月以内的工资当然很容易查询,,可是8月的还没有放上去啊。。到了哪个时候,8月份又是另外一个表的话,查询就面临大麻烦了……郁闷透了,欢迎大家继续讨论,谢谢!
我会按照情况,继续加分的
你导出的应该是csv文件,建议你用phpmyadmin导入,或者自己写一个脚本就是了。
楼上的朋友:我再次强调一下,他们原本用的数据库并不是mysql啊!!!
他们只是会用win*的!!!但是他们用的数据库可以导出txt文本数据!!现在的做法是:将该文本数据导入到mysql数据库!!!
这一点都好实现,至少我个人是能够实现。
问题就在于每个月的工资都要导入,这样的话后面的信息必然面临无法追加的情况(比如:数据表里边已经存在6月份的工资信息的话,那么7月份的工资就无法追加进去了,明白么?),但是如果我把每个月的工资单独成表的话,又面临查询的困难……现在的想法是如果每个月的工资都单独成一个数据表的话,那么要查询一个人最近几个月的工资变化情况的话,就要同时搜索这几个月的信息然后取出来
但是这样子的话,现在(7月份)要查过去几个月还好。要是到了8月、9、10……以后的月份
该怎么查询呢???难道先将这些空表(8月以后的表)建立起来,同时也做查询???
这样允许不同月份的帐户共存,
只需要将ID字段设为自增主键即可
如
id account salary dateField
1 小张 1000 2004-06-10
2 小王 1200 2004-06-10
3 小张 1100 2004-07-10
4 小张 1002 2004-08-10
......................
查询2004年的员工工资发放情况
select * from salaryTable where YEAR(dateField) = '2004';
查询员工小张所有工资发放情况
select * from salaryTable where account = '小张';
txt文本原本没有id字段,不过利用读取文本切分字串后再插入数据库的办法应该可实现自己另外加一个字段……
好的,我明天试一下。
对了,ice_berg16(寻梦的稻草人)大哥,分已经另外开帖给你加上了
这几天还会继续在监控机房,但是以后从省局培训回来后就可能没有什么机会来了
如果我试成功后,依然会另外开帖的,请进来。
谢谢你,也谢谢其他各位朋友!
这样在用load data infile时就不会出现你说的中断的现象了。
我前两天就是这样导文本的,一共导了2W多条,现在没什么问题
详情请见http://community.csdn.net/Expert/topic/3206/3206823.xml?temp=7.198733E-02