PHP实现同步远程Mysql

 PHP实现同步远程Mysql:

需求:由于公司的英文网站放置在美国,而这些网站的数据要与大陆的服务器数据同步。 同步时间在一天之内。
拿到需求之后,发现这两个网站的MYSQL数据库都不能远程访问(安全第一吧)。于是想起了 平时使用的csv文件批量录入数据。于是尝试使用CSV导入导出。

导入到处框架如下:

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

<?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="&nbsp;";

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文件即可

时间: 2024-11-05 14:58:05

PHP实现同步远程Mysql的相关文章

详解SQLServer如何链接远程MySQL数据库

最近遇到"SQL如何链接远程MySQL"这个问题,现在问题终于解决,特把方法贴出来:(我所用的操作系统是Win7,数据库是SQL2005.) 1.在SQL SERVER服务器上安装MYSQL ODBC驱动; http://dev.mysql.com/downloads/mirror.php?id=376346(下载地址) 2.安装好后,在管理工具-ODBC数据源-系统DSN-添加-选择 MYSQL ODBC 3.51 DRIVER-完成 会跳出来MYSQL连接参数. Data Sour

PHP连接远程MYSQL和MYSQL5.1中文乱码处理方法

本文描述了我在开发我的Blog的过程中所遇到的一些问题以及解决他们的方法.因为本网站采用的是一个免费的远程MySql数据库db4free.net,而且这个数据库是5.1的版本,所以在开发过程中出现了许多问题.故在此发表,以便大家参考. 一.连接远程数据库的方法 对于PHP连接远程MySql数据库,通常要使用如下的语句: 以下为引用的内容:    var $serverName     = 'db4free.net:3306';//数据库服务器     var $dbName         =

微软同步框架(MSF)入门之八--使用WCF同步远程元数据(一)

在MSF中,提供了用于存取维护元数据的一些相应工具类,即Metadata Storage Service.它可帮助存储提供程序的同步元数据,该提供程序表示无法通过其他方式存储元数据的副本.Metadata Storage Service 使用占用较小内存和磁盘空间的轻型数据库,可以随提供程序重新分发,并且安全可靠. 其所提供的API 将元数据存储区与用于访问元数据存储区的接口和方法明确区分开,这样即可实现备用存储区,且对提供程序稍作变更即可使用备用存储区. 当然上面是SDK中的一些说法:) Me

同步远程数据到本地数据库后的删除操作

问题描述 同步远程数据到本地数据库后的删除操作 同步远程数据到本地数据库后,远程数据发生变动,比如删除,那么怎么删除本地的那条数据呢. 情景: 同步淘宝api商品后保持在本地,如果卖家删除了某个商品后,本地怎么去实现同样的操作,删除那条已经在远程端被删除的数据呢! 知道思路的大侠请告知,在此小弟谢过.(j2ee开发) 解决方案 问题的关键是你怎么知道远程的数据被删除了?是淘宝api提供这个功能还是需要定期访问远程来判断商品是否还存在?知道数据被删除,那本地删除应该不是什么问题 解决方案二: ht

github-AndroidStudio怎么同步远程仓库Git的项目到本地

问题描述 AndroidStudio怎么同步远程仓库Git的项目到本地 我在项目中写错了一个东西,然后想回到原来的状态,就想把原来push到Github的项目pull下来,但是不能成功,是咋回事?给Git新手,多多指教,我用的IDEA 是Android Studio. 解决方案 如果你不介意麻烦的话,可以用Git bashpluu之前的版本,然后导入你的ide 解决方案二: Git remote 同步远程仓库,保持fork出来的项目和原有项目同步

利用Shell脚本实现远程MySQL自动查询

下面这个脚本是一个简单用来执行远程数据库查询的命令,相信大家都能看得懂,这对于有些需要每天自动检查数据库或是执行某些语句的兄弟,是很有帮助的,只要稍加修改就可以 复制代码 代码如下: #!/bin/sh HOST=192.168.5.40 USER=abc PASS=123456 QUERY=`mysql -h$HOST -u$USER -p$PASS << EOF use testdb; select * from person where name='LiMing'; exit EOF`

利用Shell脚本实现远程MySQL自动查询_Mysql

下面这个脚本是一个简单用来执行远程数据库查询的命令,相信大家都能看得懂,这对于有些需要每天自动检查数据库或是执行某些语句的兄弟,是很有帮助的,只要稍加修改就可以 复制代码 代码如下: #!/bin/shHOST=192.168.5.40USER=abcPASS=123456QUERY=`mysql -h$HOST -u$USER -p$PASS << EOFuse testdb;select * from person where name='LiMing';exitEOF`echo $QUE

Delphi中使用DBExpress组件连接远程Mysql数据库

Delphi6新增的DBExpress专门用来对付MySQL,DB2,Interbase,Oracle等数据库,使用时 注意将libmysql.dll拷贝到当前目录或系统目录(98:system,NT:system32)下,并保证您的 3306端口与远程服务器是相通的. 源程序: interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DBXpress,

微软同步框架(MSF)入门之八--使用WCF同步远程元数据(二)

到这里服务端的代码就全部列举出来了.当然本文中介绍的是元数据同步,而相应的SyncProvider实现是通过MySimpleSyncProvider.cs文件提供的,当然为了不让我的某些错误理解影响大家阅读源码,这里直接将相应的英文注释也放在这里. public class MySyncProvider : KnowledgeSyncProvider, IChangeDataRetriever, INotifyingChangeApplierTarget { // The name of the