程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP實現同步遠程Mysql

PHP實現同步遠程Mysql

編輯:關於PHP編程

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

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved