使用PHP比较来自不同服务器的两个表

时间:2011-01-10 13:48:35

标签: php mysql

我需要从两个单独的服务器上的两个单独的数据库中检索数据(用户名和电子邮件地址),并检查用户名是否仅存在于一侧而不是另一侧,并将结果显示在表中。根据我的研究,它不可能在mySQL中进行跨服务器查询,所以我试图在PHP中完成所有操作,但是我遇到了没有结果而且我的代码变得难以理解。主要问题是我需要输出与用户名相关联的电子邮件地址,但只有第一个数据库具有用户名和电子邮件地址列表。我确信我的算法效率很低,我很乐意看到一些简单的解决方案。

$handle1 = mysql_connect($db_host1,$db_username1,$db_password1);
mysql_select_db($db_name, $handle1);

$query1 = "SELECT username, email, FROM tblservices";
$result1 = mysql_query($query1);

while($row = mysql_fetch_array($result1){
$arr1[]=array(username=>$row['username'],email=>$row['email']);}

$handle2 = mysql_connect($db_host2,$db_username2,$db_password2);
mysql_select_db($db_name, $handle2);

$query2 = "SELECT username from tblradius";
$result2 = mysql_query($query2, $handle2);

while($row = mysql_fetch_array($result2)){
    $arr2[]=$row['username'];
}


echo "<p>List of users in DB1 and not DB2</p>";

$x=0;
foreach($arr1 as $row1) {
    $user1=$row1['username'];
    $email=$row1['email'];
        foreach($arr2 as $user2) {
            if ($user1==$user2) {
                $x=1;
            }
        }
        if ($x==0) {
            echo "<p>$user1 - $email is not in DB2</p>";
        }
    $x=0;
    }
}

echo "<p>List of users in DB2 and not DB1</p>";

$x=0;
foreach($arr2 as $user1) {
    foreach($arr1 as $row2) {
        $user2=$row2['username'];
        if ($user1==$user2) {
            $x=1;
        }
    }
    if ($x==0) {
        foreach($arr2 as $row3) {
            $user3 = $row3['username'];
            $email = $row3['email'];
            if ($user1==$user3) {
                echo "<p>$user3 $email - is in DB2 and not DB1</p>";
            } 
        }
    }
    $x=0;
}

}

2 个答案:

答案 0 :(得分:1)

这样的事情可以解决问题

//connect and query DB1

while($row = mysql_fetch_assoc($result1)) {
    $users[$row['username']] = $row['email'];
}

//Connect and query DB2

while($row2 = mysql_fetch_assoc($result2)) {
    if(isset($users[$row2['username']])) {
        unset($users[$row2['username']]);
    } else {
        $db2users[$row2['username']] = "No mail given for user";
    }
}

foreach($users as $username => $email) {
    echo $username . " - " . $email . " does not exist in DB2";
}
foreach($db2users as $db2username => $db2email) {
    echo $db2username . " - " . $db2email . " does not exist in DB1";
}

它的作用是将第一个查询中的所有用户添加到一个数组中,然后根据数组键将它们删除(如果它们存在于第二个数组中,这样性能也很好。)

最终数组将包含DB1中存在但不存在于DB2中的所有用户的名称和邮件。

将这些连接和查询遗漏给DB,因为你已经有了这些。

答案 1 :(得分:0)

使用电子邮件地址作为第一个数组中的键来简化数组:

<?php
$array1 = array('user1@example.com' => 'user1',
                'user2@example.com' => 'user2',
                'user3@example.com' => 'user3',
                'user4@example.com' => 'user4');
$array2 = array('user2', 'user4');
$dif = array_diff($array1, $array2);
print_r($dif);  // outputs Array ( [user1@example.com] => user1 [user3@example.com] => user3 )
?>

$ dif在DB1中为您提供了一组用户,但在DB2中没有。