如何验证MySQL副本?

时间:2015-05-23 18:48:04

标签: php mysql

我已成功将表格foo中的多个字段复制到表格bar。在删除原始记录之前,我想验证它是否已正确复制。

我尝试使用两个相同的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) }

显然我的方式不起作用。关于如何完成我想做的事情的任何建议?

2 个答案:

答案 0 :(得分:0)

您无法使用===运算符。

根据manual

  

使用identity运算符(===)时,对象变量是相同的   当且仅当他们引用同一个类的同一个实例时。

因此,当你引用不同的实例时,会在你的情况下返回false

但是,您可以使用==对它们进行比较,并为您提供所需的结果:

  

使用比较运算符(==)时,会比较对象变量   以一种简单的方式,即:两个对象实例是相等的   具有相同的属性和值,并且是相同的实例   类。

所以在你的情况下:

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

关于==运算符不适用于您的情况:您正在比较查询结果对象而不是文字字符串,对吧?如果你是,并且结果仍然是假的,你可能需要获取一行并比较行的结果而不是mysqli结果对象。

答案 1 :(得分:0)

我自己放弃用PHP编程,并在两个数据库上使用mysqldump然后只是区分这些转储。

e.g:

$ 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环境并且你可以访问你的数据库(在这种情况下使用用户“root”,但任何具有读访问权限的用户都会这样做。)

另见: How do I see the differences between 2 MySQL dumps?