iT邦幫忙

0

從A電腦insert或update資料到B電腦

大家好
請問
從A電腦insert或update資料到B電腦
A電腦和B電腦先行比對
若A電腦有一筆資料
而B電腦沒有這一筆
則使用insert
若A電腦有一筆資料
而B電腦也有這一筆
則使用update
update到B電腦
程式碼如下
<?php
ini_set("memory_limit", "512M");
//先連至B電腦
$conn1=mysql_connect('192.168.1.40:3306','root', '');
if (!$conn1)
{
die('Could not connect: '.mysql_error());
}

mysql_select_db('ZEN');
$query1="SELECT * FROM zenpat";
$result1=mysql_query($query1);
$DBarray=mysql_fetch_row($result1);
$num=mysql_numrows($result1);
if (!$result1)
{
die('Query failed: ' . mysql_error());
}
//連至A電腦
$conn2=mysql_connect('192.168.1.10:3302','root', '');
if (!$conn2)
{
die('Could not connect: '.mysql_error());
}
mysql_select_db('ppks');
$query2="SELECT * FROM PAT";
$result2=mysql_query($query2);
$DBarray2=mysql_fetch_row($result2);
if (!$result2)
{
die('Query failed: ' . mysql_error());
}

for($jj=0;$jj++;$jj<count($DBarray))
{
//進行比對
if($DBarray['PAT_ID']==$DBarray2['PAT_ID'])
{
if($DBarray['PAT_NAME']!=$DBarray2['PAT_NAME'] || $DBarray['PAT_LDATE']!=$DBarray2['PAT_LDATE'])
{
//比對後,若有資料則update
mysql_query("UPDATE zenpat SET PAT_NAME=$DBarray2['PAT_NAME'],PAT_LDATE=$DBarray2['$PAT_LDATE']);
}
break;
}
}
//若無資料,則insert
mysql_query("INSERT INTO zenpat STORE_ID,PAT_ID,PAT_NAME,PAT_BDAY,PAT_TEL1,PAT_TEL2,PAT_FDATE,PAT_LDATE)
VALUES('333','$PAT_ID','$PAT_NAME','$PAT_BDAY','$PAT_TEL1','$PAT_TEL2','$PAT_FDATE','$PAT_LDATE')");
}
mysql_close($conn1);
mysql_close($conn2);
?>

謝謝大家^^

6
fillano
iT邦超人 1 級 ‧ 2010-03-30 19:32:13
最佳解答

用程式來同步兩個mysql資料庫太浪費時間了。要不要考慮使用mysql replication?

建議先參考手冊:
http://dev.mysql.com/doc/refman/5.0/en/replication.html
用關鍵字在google搜尋也可以找到許多資料。

一般mysql replication的作法是一個master-slave架構,資料寫入master,然後同步到幾台slave,如果要分散流量,讀取可以盡量用slave。但是這樣master如果掛掉就慘了,所以有人提出一個master-master架構,可以參考來混用:
http://mysql-mmm.org/

一些中文介紹:
http://plog.longwin.com.tw/news-technology/2008/10/21/mysql-master-replication-manager-mmm-intro-2008
http://blog.wu-boy.com/2008/12/30/667/

看更多先前的回應...收起先前的回應...
tom0705 iT邦新手 5 級 ‧ 2010-03-30 20:32:48 檢舉

謝謝您

我各別測過
update的部分有問題
insert的部份沒問題
不知道問題出在哪裡
請大家幫忙看看^^
P.S
我已經設定了MASTER SLAVE Replication
已經分別從9個地方的資料庫匯集同步
到集中一台主機,正運作非常好
因為這台主機資料庫zen的
zenpat table要加工加欄位的關西
所以又另處理
上面程式中有一行VALUES('333','$PAT_ID'
就是要加工的痕跡步驟^^

fillano iT邦超人 1 級 ‧ 2010-03-30 21:56:34 檢舉

了解

fillano iT邦超人 1 級 ‧ 2010-03-30 22:43:56 檢舉

另外,你都沒提到到底出了什麼問題,所以猜一下好了。

$conn1, $conn2都沒拿來用?這樣可能會出問題吧...既然你同時連接兩個資料庫,把他拿來用會比較明確。

tom0705 iT邦新手 5 級 ‧ 2010-03-31 08:10:17 檢舉

[quote=tom0705]
不好意思
問題寫的不清楚
程式碼中
//進行比對
if($DBarray['PAT_ID']==$DBarray2['PAT_ID'])
{
if($DBarray['PAT_NAME']!=$DBarray2['PAT_NAME'] || $DBarray['PAT_LDATE']!=$DBarray2['PAT_LDATE'])
//比對後,若有資料則update
mysql_query("UPDATE zenpat SET PAT_NAME=$DBarray2['PAT_NAME'],PAT_LDATE=$DBarray2['$PAT_LDATE']);
問題是沒有進行update data
會不會是前面的
//進行比對
if($DBarray['PAT_ID']==$DBarray2['PAT_ID'])
錯誤呢?
謝謝

fillano iT邦超人 1 級 ‧ 2010-03-31 09:42:00 檢舉

有一些問題,我在酷學園問了,不過還是整理一下...簡單地說,有幾個可能的問題,你都檢查一下吧:

  1. 你這裡混用兩個資料庫的查詢,為了怕程式的動作不符合你的預期,請盡量在可以用$link_identifier參數的地方都加上去比較好。($conn1跟$conn2,請參考http://tw2.php.net/manual/en/function.mysql-query.php

  2. 你的update動作應該是一筆一筆的,是不是應該要有where子句?

  3. mysql_fetch_row一次只會從query中取出一個row的結果,你程式這樣寫有問題啦,應該用

    <pre class="c" name="code">
    function mysql_fetch_all($res) {
    while($row=mysql_fetch_array($res)) {
    $return[] = $row;
    }
    return $return;
    }
    $DBarray=mysql_fetch_all($result);
    $DBarray2=mysql_fetch_all($result2);

把所有查詢結果取出來(那個函數是從http://tw2.php.net/manual/en/function.mysql-fetch-row.php借來用的),然後再比較兩個陣列。另外還有一個問題,mysql_fetch_row取出的是一個用數字索引的row陣列,你要取出雜湊陣列的話,應該用mysql_fetch_array。雜湊陣列才能用你的方式做比較。mysql_fetch_array的動作與mysql_fetch_row一樣,都是一次取一列,所以你還是需要改一下程式。

6
elsoncck
iT邦新手 3 級 ‧ 2010-03-30 19:39:00

假設AB 二電腦的資料欄位都是一樣的.... 而且又用mySQL..
或許你可以試試看 REPLACE INTO 的語法..

tom0705 iT邦新手 5 級 ‧ 2010-03-30 20:34:16 檢舉

tom0705提到:

謝謝您
我會試著用用^^

tom0705 iT邦新手 5 級 ‧ 2010-03-31 09:23:26 檢舉

您好
我更改後
程式碼如下
mysql_query("REPLACE INTO zenpat(STORE_ID,PAT_ID,PAT_NAME,PAT_BDAY,PAT_LDATE,) VALUES('106','$PAT_ID','$PAT_NAME','$PAT_BDAY','$PAT_LDATE')");
會不會是語法下錯
程式只做新增
原來就有的資料不會做更新???
前面要加判斷式???
判斷是否就資料???
謝謝您

elsoncck iT邦新手 3 級 ‧ 2010-03-31 22:12:08 檢舉

Note that unless the table has a PRIMARY KEY or UNIQUE index, using a REPLACE statement makes no sense. It becomes equivalent to INSERT, because there is no index to be used to determine whether a new row duplicates another.
表裡面一定要有一個 主鍵或 unique index,不然 replace into 和 insert into 沒有差別... replace into 遇到舊資料會先 delete再insert ~ 沒有舊資料就是直接insert ~
http://dev.mysql.com/doc/refman/5.0/en/replace.html

2
silly
iT邦好手 2 級 ‧ 2010-03-31 09:40:25

update語法處,將value用單引號刮起來;另外結尾處也少個雙引號:
mysql_query("UPDATE zenpat SET PAT_NAME='".$DBarray2['PAT_NAME']."',PAT_LDATE='".$DBarray2['$PAT_LDATE']."'");

tom0705 iT邦新手 5 級 ‧ 2010-04-01 13:29:35 檢舉

謝謝您
請問這樣語法對嗎?
mysql_query("UPDATE zen SET NAME='NAME2',BDAY='BDAY2' WHERE ID='ID2');
謝謝您

我要發表回答

立即登入回答