资源描述
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=" ";
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文件即可
展开阅读全文