我的目标是根据角色权重列出所有较小的用户,例如,如果用户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 . ')';
}
}
}
?>
答案 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 . ')';
}
}
}