Compare two tables from different servers using PHP
I need to retrieve data (usernames and email addresses) from two separate databases on two separate servers and check if a username only exists on one side and not the other and display the result in a table. From my research its not possible to do cross server queries within mySQL, so I am trying to do it all in PHP but I'm getting stuck with no results and my code is becoming unreadable. The main problem is that I need to output the email address associated with a username where possible, but only the first database has the list of usernames and email addresses. I'm convinced my algorithms are totally inefficient and I would love to see some simple solutions.
$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>";
}开发者_如何学Python
}
}
$x=0;
}
}
Something like this should do the trick
//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";
}
What it does is it adds all users from the first query to an array, then remove them if they exist in the second array based on the array key which makes performance good too.
The final array will then contain the name and mail of all user that existed in DB1 but not in DB2.
Left out the connections and queries to the DBs as you already had those ok.
Simplify the arrays by using the email addresses as the keys in the first array:
<?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 gives you an array of users in DB1, but not in DB2.
精彩评论