大家好
請問
從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);
?>
謝謝大家^^
用程式來同步兩個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/
謝謝您
我各別測過
update的部分有問題
insert的部份沒問題
不知道問題出在哪裡
請大家幫忙看看^^
P.S
我已經設定了MASTER SLAVE Replication
已經分別從9個地方的資料庫匯集同步
到集中一台主機,正運作非常好
因為這台主機資料庫zen的
zenpat table要加工加欄位的關西
所以又另處理
上面程式中有一行VALUES('333','$PAT_ID'
就是要加工的痕跡步驟^^
了解
另外,你都沒提到到底出了什麼問題,所以猜一下好了。
$conn1, $conn2都沒拿來用?這樣可能會出問題吧...既然你同時連接兩個資料庫,把他拿來用會比較明確。
[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'])
錯誤呢?
謝謝
有一些問題,我在酷學園問了,不過還是整理一下...簡單地說,有幾個可能的問題,你都檢查一下吧:
你這裡混用兩個資料庫的查詢,為了怕程式的動作不符合你的預期,請盡量在可以用$link_identifier參數的地方都加上去比較好。($conn1跟$conn2,請參考http://tw2.php.net/manual/en/function.mysql-query.php)
你的update動作應該是一筆一筆的,是不是應該要有where子句?
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一樣,都是一次取一列,所以你還是需要改一下程式。
假設AB 二電腦的資料欄位都是一樣的.... 而且又用mySQL..
或許你可以試試看 REPLACE INTO 的語法..
tom0705提到:
的
謝謝您
我會試著用用^^
您好
我更改後
程式碼如下
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')");
會不會是語法下錯
程式只做新增
原來就有的資料不會做更新???
前面要加判斷式???
判斷是否就資料???
謝謝您
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
update語法處,將value用單引號刮起來;另外結尾處也少個雙引號:
mysql_query("UPDATE zenpat SET PAT_NAME='".$DBarray2['PAT_NAME']."',PAT_LDATE='".$DBarray2['$PAT_LDATE']."'");