2014-01-07 221 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 . ')';   
    } 
    } 
} 
相關問題