2016-03-01 184 views
-1

我是初学者,我试图用下拉菜单制作一个简单的导航菜单,但第一个循环在嵌套循环完成时停止。有什么建议吗?请分析一下,因为我的编程技巧很低。第一个while循环在第二个while循环结束时停止

<?php 

function nav_main($dbc, $path) { 

    $q = "SELECT * FROM navigation ORDER BY position ASC"; 
    $r = mysqli_query($dbc, $q); 

    while($nav = mysqli_fetch_assoc($r)) { 

     $nav['slug'] = get_slug($dbc, $nav['url']); 

     if($nav['parent_id'] == 0) { 

?> 

    <li<?php selected($path['call_parts'][0], $nav['slug'], ' class="active"') ?>><a href="<?php echo $nav['url']; ?>"><?php echo $nav['label']; ?></a></li> 

<?php 
     } 
     elseif ($nav['parent_id'] == 1) { 
?> 

    <li class="dropdown<?php selected($path['call_parts'][0], $nav['slug'], ' active"') ?>"><a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><?php echo $nav['label']; ?><span class="caret"></span></a> 
    <ul class="dropdown-menu"> 

<?php 

      while($subnav = mysqli_fetch_assoc($r)) { 

       $subnav['slug'] = get_slug($dbc, $subnav['url']); 

       if($subnav['parent_id'] == 3) { 

?>  
       <li><a href="<?php echo $subnav['url']; ?>"><?php echo $subnav['label']; ?></a></li> 
       <li role="separator" class="divider"></li> 
<?php 
       } 
      } 
?> 

      </ul> 
      </li> 

<?php 
     } 
    } 
} 
?> 
+2

代码中只有**一个**'while'... – FirstOne

+1

如果您缩进并放入您的代码,我们和您的代码会更容易阅读在他们自己的行上加上大括号......我们也看不到'elseif {}'块是什么的延续。 – Hektor

+0

这是我现在有时看到的一个常见错误。 **当第二个循环到达结尾时,结果集也在最后**,所以没有其他的东西留给第一个循环来使用... [本页](http://stackoverflow.com/questions/ 6439230/how-to-go-through-mysql-result-twice)是关于这个问题的(但请注意,在这个问题中,它是关于'mysql_ *'** not **'mysqli_ *'编辑:我建议你循环结果集一次,并将值保存到另一个数组,然后你可以循环它任意多次你想.. – FirstOne

回答

0

你的while循环正在处理相同的结果集!

因此很明显,当第二个while循环结束时,结果集被完全消耗,并且没有任何东西留给外部,而是看起来要做但终止。

这是一个精确的,你在做什么: -

$q = "SELECT * FROM navigation ORDER BY position ASC"; 
$r = mysqli_query($dbc, $q); 

// first while loop 
while($nav = mysqli_fetch_assoc($r)) { 

    // inner while loop 
    while($subnav = mysqli_fetch_assoc($r)) { 

两者都是使用$r,因此无论您使用的是不同的变量来保存返回的行数据的内部循环会消耗行的2->end与在外部while循环中正在处理的结果集相同

+0

你是对的我的朋友我刚刚修复了第二个结果。谢谢。 –

+0

[This answer](http: //stackoverflow.com/a/6631631/4577762)显示了一个解决方案,它包含将值保存在一个数组中,只是不要忘记适应'mysqli_ *'。另外,由于这使用内部和外部循环,因此请记住使用这种方法使用不同的变量名... – FirstOne

+0

值得强调的是不应该使用这个答案的代码吗?只是一个想法,导致人们可能会警察Ÿ它甚至没有阅读解释后立即它(我知道我可能xD) – FirstOne