2013-02-05 153 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.