2013-02-05 200 views
1

我有一個「無稽之談」的問題與PHP。第一循環應該從表中得到一定的記錄,並把它比作在第二個表中的所有記錄...嵌套while循環不工作?

所以我希望它打印41「第二」的每一個‘第一次’後的。由於第二個表中有41條記錄。但是,while循環第一次工作,並忽略第二個while循環。

結果我得到:

1st2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st ...

while($row = mysql_fetch_array($select)) 
{ 
    echo "1st"; 
    while($row2 = mysql_fetch_array($select2)) 
    { 
     echo "2nd"; 
     $string = $row2["header"]; 
     $find = $row["email"]; 
     if(strstr($string, $find)) { 
      $email = $row["email"]; 
      echo "found it"; 
     } else { 
      //no email found 
     } 
    } 
} 
+0

您是否嘗試過使用嵌套for循環而不是while循環?對於(在數據的每個項目){用於...} – lukeocom

回答

1

你需要進入內循環之前執行第二個查詢:

 

    while($row=mysql_fetch_array($select)) 
    { 
     echo "1st"; 

     $select2 = mysql_query("select ..."); 

     while($row2=mysql_fetch_array($select2)) 
     { 

更好的是在開始第一循環之前運行第二個查詢,並記錄保存到另一個陣列。那麼你可以避免n^2查詢:

 

    $emailToRecord = array(); 
    $select2 = mysql_query("select ..."); 
    while($row2=mysql_fetch_array($select2)) { 
     $emailToRecord[$row2["header"]] = $row2; 
    } 

    while($row=mysql_fetch_array($select)) 
    { 
     echo "1st"; 
     $find = $row["email"]; 
     if (isset($emailToRecord[$find])) { 
       echo "found it"; 
     } 
    } 

+0

這是最簡單的方法,謝謝! –

0

除非它在這兩個查詢相同數量的行,這將ofcourse不發佈相同。
你可以添加查詢($ select和$ select2)嗎?

而且可能有人告訴我如何發表評論,而不是答案?

<?php 
    $select=mysql_query("SELECT email FROM database.tablename"); 
    $select2=mysql_query("SELECT header FROM database2.tablename2"); 

    while($row=mysql_fetch_assoc($select)) 
    { 
     echo "1st"; 
     $find = $row["email"]; 
     while($row2=mysql_fetch_assoc($select2)) 
     { 
      echo "2nd"; 
      $string = $row2["header"]; 
      if(strstr($string, $find)) 
      { 
       $email=$find; 
       echo "found it"; 
      } 
      else 
      { 
        //no email found 
      } 

     } 
    } 
+0

[評價](http://stackoverflow.com/privileges/comment) – Class

+0

$選擇=請求mysql_query( 「選擇電子郵件FROM database.tablename」); $ SELECT2 =請求mysql_query( 「選擇FROM database2.tablename2頭」); –

+0

使用Foreach還是將它們放在同一個表中?爲什麼你有兩個數據庫? –

0

我希望這是有道理的。

這是因爲第一個while執行第二個while循環,直到它結束才結束,然後它結束並返回到第一個,然後它返回true(另一行)並執行並進入下一個雖然,但是它指向當前'行'的指針已到達結尾,因此它不會執行,它主要只是執行主循環。這就是爲什麼你122222221111111

+0

ohhhh,這就是爲什麼......有沒有辦法重置它,所以它會再次走? 謝謝你這麼多,從來沒有想過, –

+0

'復位($行)'可能工作 – Class

0

不要運行mysql_fetch_array內的另一個while循環。首先提取所有數據並比較兩個表的結果。

$select=mysql_query("SELECT email FROM database.tablename"); 
$select2=mysql_query("SELECT header FROM database2.tablename2");  
while($row=mysql_fetch_array($select)) { 
    $first[] = $row["email"]; 
} 
while($row2=mysql_fetch_array($select2)) { 
    $second[] = $row2["header"]; 
} 
foreach ($first as $item) { 
    if (($key = array_search($item, $second)) !== false) { 
     $email[] = $second[$key]; 
    } 
} 
print_r($email); // Get all the emails that exist in both tables.