2011-01-10 17 views
0

2つの別々のサーバー上の2つのデータベースからデータ(ユーザー名と電子メールアドレス)を取得し、一方の側にのみユーザー名が存在し、表。私の研究では、MySQL内でクロスサーバクエリを実行できないので、PHPですべての処理を実行しようとしていますが、結果がなくなり、コードが判読不能になっています。主な問題は、できるだけユーザー名に関連付けられた電子メールアドレスを出力する必要がありますが、最初のデータベースだけがユーザー名と電子メールアドレスのリストを持つことです。私のアルゴリズムは完全に非効率であると確信しています。私はいくつかの簡単な解決策を見たいと思っています。このようなPHPを使用して異なるサーバーの2つのテーブルを比較する

$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; 
} 

}

答えて

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"; 
} 

を行う必要があり、それは配列に最初のクエリからすべてのユーザーを追加している彼らが存在する場合は、それらを削除パフォーマンスを良くする配列キーに基づいた2番目の配列。

最後の配列には、DB1に存在し、DB2には存在しないすべてのユーザーの名前とメールが格納されます。

あなたは既にそれらのokを持っていたので、DBへの接続とクエリを省きました。

0

最初の配列のキーとしての電子メールアドレスを使用して配列を簡素化:

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

$のDIFはあなたDB1ではなく、DB2のユーザーの配列を与えます。

関連する問題