为什么在第一个循环中循环中断

时间:2014-01-07 11:40:58

标签: php mysql loops drupal-7

我的目标是根据角色权重列出所有较小的用户,例如,如果用户U1的角色为R1,权重为10,则U2的R2为权重为2,而U3的R3为权重为5.输出将为(U1,U2)(U1,U3)(U3,U2)和(U2,Null)。列出第一行中的所有较小用户,但似乎在第一个循环中的中断。这是我的代码谢谢

 <?php
 $uids = array(8,9,10,11,12,13,14,15);
 $result = db_query("SELECT u.uid, u.rid, r.name, r.weight FROM {role} r INNER JOIN      {users_roles} u ON u.rid = r.rid WHERE u.uid IN (:uids)", array(':uids' => $uids));
 $i = 0;
 for ($i = 0; $role = $result->fetchAssoc(); ++$i) {
    print $role['uid'].',';
       foreach($result as $urole) {
         if ($role['weight'] > $urole->weight) {
           echo '(' . $role['uid'] . ',' . $urole->uid  . ')';        
         } 
      }
   }
?>

4 个答案:

答案 0 :(得分:0)

$role = $result->fetchAssoc()

实际上并没有打破循环。我猜测foreach($ result ....)是..尽管使用起来并不常见,但我认为在第7行更改$ result的foreach实际上是错误的操作$ result变量使得下一个fetchAssoc()返回假。

我确实建议使用while循环,而Shankar已经说过了。

答案 1 :(得分:0)

试试这个:

<?php
 $uids = array(8,9,10,11,12,13,14,15);
 $result = db_query("SELECT u.uid, u.rid, r.name, r.weight FROM {role} r INNER JOIN      {users_roles} u ON u.rid = r.rid WHERE u.uid IN (:uids)", array(':uids' => $uids));
 $i = 0;
 while ($role = $result->fetchAssoc()) {
    print $role['uid'].','; 
       foreach($result->fetchObject() as $urole) {
         if ($role['weight'] > $urole->weight) {
           echo '(' . $role['uid'] . ',' . $urole->uid  . ')';        
         } 
      }
   }
?>

答案 2 :(得分:0)

当头部中的第二个条件为真时,for循环结束:

for ($i = 0; $role = $result->fetchAssoc(); ++$i) {

但是一个赋值($ role = $ result-&gt; fetchAssoc())总是如此,你需要在for循环结束时进行比较。

但你不知道你有多少结果集,除了你要求num_rows所以for循环不是最好的解决方案,试试:

while($role = $result->fetchAssoc() != false) {

}

如果您需要计数器,请手动执行:

$c = 0;
while($role = $result->fetchAssoc() != false) {
    $c++;
}

答案 3 :(得分:0)

将for循环更改为while循环:

while ($role = $result->fetchAssoc()) {
     print $role['uid'].',';
     foreach($role as $urole) {
     if ($role['weight'] > $urole->weight) {
       echo '(' . $role['uid'] . ',' . $urole->uid  . ')';        
     } 
  }
}