浅析用PHP实现同步远程Mysql

浅析用PHP实现同步远程Mysql

需求:由于公司的英文网站放置在美国,而这些网站的数据要与大陆的服务器数据同步。同步时间在一天之内。

拿到需求之后,发现这两个网站的MYSQL数据库都不能远程访问(安全第一吧)。于是想起了平时使用的CSV文件批量录入数据。于是尝试使用CSV导入导出。

导入到处框架如下:

1首先将数据导出成CSV的格式。

建立一文件,放置在中国服务器上:csv.php.其实就是一个导出函数,通过数据库,表名和SQL语句来获得数据。

<?php

/**

*输出一个数据库中的表到一个CSV文件中

*

*@paramstringMysql数据库的主机

*@paramstring数据库名称

*@paramstring数据库中的表名

*@paramstring数据库的连接用户名

*@paramstring数据库的连接密码

*@paramstring数据库的表名

*@paramstring数据库的

*@paramstring错误页面

*@paramstringSQL语句

*

*@returntext返回CSV格式的内容

*

*@accesspublic

*/

functionPMA_exportData(host,db,user,pass,filename,table,crlf,error_url,sql_query){

what="csv";

csv_terminated="";

csv_separator=",";

csv_enclosed="";

csv_escaped="&nbsp;";

mysql_connect(host,user,pass)ordie("不能连接数据库,错误代码如下:".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;

}

}//endfor

//fwrite(fp,schema_insert.csv_terminated);

cc.=schema_insert.csv_terminated;

}//endwhile

mysql_free_result(result);

//fclose(fp);

returncc;

}

?>

2.将CSV格式的内容导入到表中

在美国服务器上建立个导入的文件,放置:import.php,代码如下:

<?php

/**

*从一个上传的文件中将数据导入到一个表中

*

*@paramstringMysql数据库的主机

*@paramstring数据库名称

*@paramstring数据库中的表名

*@paramstring数据库的连接用户名

*@paramstring数据库的连接密码

*@paramstring数据库的表名

*

*@returnbool是否执行成功

*

*@accesspublic

*/

functionuploadFileOfCsv(host,db,user,pass,table,content){

mysql_connect(host,user,pass)ordie("不能连接数据库,错误代码如下:".mysql_error());

mysql_select_db(db);

result=mysql_query("select*fromtable");

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"<scriptlanguage='javascript'>";

echo"alert('第".i."行的ID空,请检查!');";

echo"location.href=document.referrer;";

echo"</script>";

exit;

}

query="INSERTINTOdb.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',";

}

}//endfor(q=0;

log2(query);

mysql_query(query);

}

fclose(fp);

return"OK";

unlink("C:test.csv");

}

functionlog2(event=null){

//globaldb;

//globallogin;

if(LOG_ENABLED){

now=date("Y-M-dH: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*fromtb_project_dvp");

handle=fopen(filename,"rb");

contents=fread(handle,filesize(filename));

fclose(handle);

?>

<formname="form1"method="post"action="http://美国网站的地址/test2.php">

<p>

<textareaname="textarea"cols="180"rows="30"><?phpechocc?></textarea>

<inputtype="hidden"name="action"value="1"/>

</p>

<p>

<inputtype="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'];

echouploadFileOfCsv(host,db,user,pass,"tb_project_dvp",content);

}

?>

最后利用Windows-xp/nt/03控制面版中自带任务计划,调度执行中国服务器test_export.php文件即可。