2014-01-07 336 views
0

我的目标是根据角色权重列出所有较小的用户,例如,如果用户U1具有权重为10的R1的角色,并且U2具有权重为2的R2且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 . ')';   
     } 
     } 
    } 
?> 
+0

您是否尝试过使用,同时,而不是for循环? – Goikiu

+0

'$ role = $ result-> fetchAssoc()'在for循环中是原因。 –

回答

0
$role = $result->fetchAssoc() 

实际上没有破环。我猜foreach($ result ....)是..虽然它不常见,但我认为改变foreach在$ 7结果上的行实际上是错误的操作$ result变量,使下一个fetchAssoc()返回false。

我建议使用while循环来代替Shankar所说的。

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 . ')';   
     } 
     } 
    } 
?> 
0

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

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

但是赋值($角色= $ result-> fetchAssoc())总是如此,你需要在for循环结束时进行比较。

但是你不知道你有多少个结果集有除了你问NUM_ROWS这样一个for循环是不是最好的解决方案在这里,尝试在:

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

} 

,如果你需要一个柜台做手工:

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

更改为循环到while循环:

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