2015-05-23 68 views
2

我已將表foo中的幾個字段成功複製到表bar。現在,在我刪除原始記錄之前,我想驗證它是否被正確複製。如何驗證MySQL副本?

我嘗試使用兩個相同的SQL查詢,將其分配給變量,然後用一個比較操作符比較變量(嘗試都==和===),如下所示:

$sqlFoo = "SELECT `value` FROM `foo` WHERE `user` = '000';"; 
$sqlBar = "SELECT `value` FROM `bar` WHERE `user` = '000';"; 

$resultFoo = $db->query($sqlFoo); 
$resultBar = $db->query($sqlBar); 

If ($resultFoo == $resultBar) { 
// Proceed 
} 

當此沒沒有工作,我用我的變量var_dump和他們都返回:

object(mysqli_result)#2 (5) { ["current_field"]=> int(0) ["field_count"]=> int(16) ["lengths"]=> NULL ["num_rows"]=> int(0) ["type"]=> int(0) } 
object(mysqli_result)#3 (5) { ["current_field"]=> int(0) ["field_count"]=> int(16) ["lengths"]=> NULL ["num_rows"]=> int(0) ["type"]=> int(0) } 

顯然我的方式是行不通的。任何關於我如何能夠完成我想要做的事情的建議?

回答

0

您不能使用===運算符。

按照manual

當使用恆等算子(===),對象變量是相同的 當且僅當它們指的是同一類的相同的實例。

因此,這將在你的情況下返回false因爲它們都指向不同的實例。

但是,您可以使用==比較他們,爲您提供所需的結果:

當使用比較操作符(==),對象變量進行比較簡單的方式 ,即:兩如果對象實例的 具有相同的屬性和值,並且是相同的 類的實例,則它們是相等的。

所以你的情況:

if ($sqlFoo_result_object === $sqlBar_result_object) { 
    // Proceed 
} 

關於==運營商在你的情況不工作:你比較查詢結果的對象,而不是文字字符串,對不對?如果你是,結果仍然是錯誤的,你可能需要獲取一行並比較行的結果而不是mysqli結果對象。

+0

我更新了我的問題,以反映的事實,我確實比較結果,而不是實際的查詢,並在當我做的var_dump使用操作數是(==)。我擔心我可能不得不比較提取的行。我會試試這個,讓你知道它是如何變成的。感謝您的建議! –

+0

@RodtheSunGod我不熟悉mysqli結果對象能夠告訴你,如果你可以輕鬆地比較它們,我幾乎從不使用mysqli說實話:-) – jeroen

+0

你使用PDO嗎?如果是這樣,你知道一種方法來完成這個使用該方法嗎?我還沒有太多使用PDO,但如果它能幫助我完成任務,我願意嘗試一下:) –

0

我會放棄在PHP編程它本身,並會在這兩個數據庫上使用mysqldump,然後只是比較這些轉儲。

如:

$ mysqldump -u root -p --skip-opt db_name foo >/tmp/foo 
$ mysqldump -u root -p --skip-opt db_name bar >/tmp/bar 
$ diff /tmp/foo /tmp/bar 

以上顯然是假設你有一個UNIX環境,你可以訪問你的數據庫(在這種情況下,使用用戶的「根」,但有讀取權限會做任何用戶) 。

參見: How do I see the differences between 2 MySQL dumps?