Posted in PHP onOctober 21, 2009
拿到需求之后,发现这两个网站的MYSQL数据库都不能远程访问(安全第一吧)。于是想起了 平时使用的CSV文件批量录入数据。于是
尝试使用CSV导入导出。
导入到处框架如下:
1首先将数据导出成CSV的格式。
建立一文件,放置在中国服务器上:csv.php.其实就是一个导出函数,通过数据库,表名和SQL语句来获得数据。
csv.php
<?php /** * 输出一个数据库中的表到一个CSV文件中 * * @param string Mysql数据库的主机 * @param string 数据库名称 * @param string 数据库中的表名 * @param string 数据库的连接用户名 * @param string 数据库的连接密码 * @param string 数据库的表名 * @param string 数据库的 * @param string 错误页面 * @param string SQL语句 * * @return text 返回CSV格式的内容 * * @access public */ function PMA_exportData(host,db,user,pass,filename,table, crlf, error_url, sql_query) { what="csv"; csv_terminated=" "; csv_separator=","; csv_enclosed=" "; csv_escaped=" "; mysql_connect(host, user,pass) or die("不能连接数据库,错误代码如下:" . mysql_error()); mysql_select_db(db); result = mysql_query(sql_query); fields_cnt = mysql_num_fields(result); cc=""; //fp = fopen(filename, 'w'); // 格式化数据 while (row = mysql_fetch_row(result)) { schema_insert = ''; for (j = 0; j < fields_cnt; j++) { if (!isset(row[j]) || is_null(row[j])) { schema_insert .="NULL"; //用什么来替换空值 } elseif (row[j] == '0' || row[j] != '') { // loic1 :用引号包含字段值 if (csv_enclosed == '') { schema_insert .= row[j]; } else { schema_insert .= csv_enclosed . str_replace(csv_enclosed, csv_escaped . csv_enclosed, row[j]) . csv_enclosed; } } else { schema_insert .= ''; } if (j < fields_cnt-1) { schema_insert .= csv_separator; } } // end for // fwrite(fp,schema_insert . csv_terminated); cc.=schema_insert . csv_terminated; } // end while mysql_free_result(result); // fclose(fp); return cc; } ?>
2.将CSV格式的内容导入到表中
在美国服务器上建立个导入的文件,放置:import.php ,代码如下:
<?php /** * 从一个上传的文件中将数据导入到一个表中 * * @param string Mysql数据库的主机 * @param string 数据库名称 * @param string 数据库中的表名 * @param string 数据库的连接用户名 * @param string 数据库的连接密码 * @param string 数据库的表名 * * @return bool 是否执行成功 * * @access public */ function uploadFileOfCsv(host,db,user,pass,table,content){ mysql_connect(host, user,pass) or die("不能连接数据库,错误代码如下:" . mysql_error()); mysql_select_db(db); result = mysql_query("select * from table"); fields_cnt = mysql_num_fields(result); test2=array(array()); rownum=0; log("提取的数据如下:<br>".content); fd1 = fopen ("C:test.csv",'a'); fwrite(fd1,content); fclose(fd1); fp = fopen("C:test.csv", "r"); while (buffer = fgets(fp,4096)) { i++; tmp_arr = explode(",",buffer); if(trim(tmp_arr[0]) == ""){ echo "<script language='javascript'>"; echo "alert('第".i."行的ID空,请检查!');"; echo "location.href=document.referrer;"; echo "</script>"; exit; } query = "INSERT INTO db.table"; query .=" values ( "; for(q=0;q<fields_cnt;q++){ if(q==fields_cnt-1){ tmp=tmp_arr[q]; query.="'tmp');"; }else{ tmp=tmp_arr[q]; query.="'tmp',"; } }//end for(q=0; log2(query); mysql_query(query); } fclose(fp); return "OK"; unlink("C:test.csv"); } function log2(event = null){ //global db; // global login; if(LOG_ENABLED){ now = date("Y-M-d H:i:s"); fd = fopen ("C:log.html",'a'); log = now." "._SERVER["REMOTE_ADDR"] ." - event <br>"; fwrite(fd,log); fclose(fd); } } ?>
3调用函数执行导出
在中国服务器上再建立一个 文件:test_export.php,调用前面的csv.php的函数,然后将数据转成CSV,然后临时存到一个表单的
textera中,注意表单提交的位置:
<?php require_once("csv.php"); host="localhost"; db="project"; user="root"; pass=""; //导出tb_contact表的数据为csv文件 filename = 'file4.csv'; cc=PMA_exportData( host,db,user,pass, filename,"tb_project_dvp", "", "test.php", "select * from tb_project_dvp") ; handle = fopen(filename, "rb"); contents = fread(handle, filesize (filename)); fclose(handle); ?> <form id="form1" name="form1" method="post" action="http://美国网站的地址/test2.php"> <p> <textarea name="textarea" cols="180" rows="30"><?php echo cc?></textarea> <input type="hidden" name="action" value="1"/> </p> <p> <input type="submit" name="Submit" value="提交"> </p> </form>
再在美国服务器上防置如下文件用于接受上传上来的数据,文件名为 test_import.php:
<?php require_once("csv.php"); require_once("import.php"); host="localhost"; db="wintopweb"; user="root"; pass=""; if(_POST['action']=="1"){ content=_POST['textarea']; echo uploadFileOfCsv(host,db,user,pass,"tb_project_dvp",content); } ?>
最后 利用Windows-xp/nt/03 控制面版中自带 任务计划,调度执行中国服务器test_export.php文件即可
php实现mysql同步的实现方法
声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@