2011-12-15 86 views
0

我有搜索元素在PHP数组

  • 名为users表“成员”
  • 一间名为表“房间”
  • 用户ID相关联的ID的表房间“membersRooms”的

我应该写一个循环,打印与所有房间的每个用户一个下拉列表,但增加了“选择”与用户相关联的房间属性

这个循环有什么问题?

$members = mysql_query("SELECT * FROM members "); 
$rooms = mysql_query("SELECT * FROM rooms"); 

while($member = mysql_fetch_array($members)){ 
    echo("<select>"); 
    $roomsOfUser = mysql_query("SELECT roomID FROM membersRooms WHERE userID=".$member["id"]); 
    $cuArray = mysql_fetch_array($roomsOfUser); 

    while($room = mysql_fetch_array($rooms)){ 
     if(in_array($room["id"],$cuArray,true)) 
      echo("<option selected='selected'>".$room["roomName"]."</option>"); 
     else 
      echo("<option>".$class["roomName"]."</option>"); 
    } 
    echo("</select>"); 
} 
+2

在while循环中抛出select让DBA揍小猫。 – 2011-12-15 01:00:25

+0

你确定两者的数据类型是否相同,你是否真的需要确保?如果没有为in_array调用启用严格的类型检查,它会工作吗?尝试从in_array调用中移除第三个“true”参数,然后查看它是否有效。 – 2011-12-15 01:15:35

+0

不,它不工作...是的,他们都是int @DigitalPrecision我需要为每个用户下拉..我该怎么办? – Janky 2011-12-15 01:20:49

回答

2

为了让你更容易一点,你可以尝试在你的数据库中使用左右连接。这将显着减少您的服务器负载,并仍然允许您执行相同的功能。

我相信,如果我在读你的数据库结构的权利,这you'ld想沿着线的东西:

SELECT members.id as memberID, rooms.id as roomID, rooms.roomName, membersRooms.roomID as memberRoom 
FROM members 
LEFT JOIN membersRooms 
ON members.id = membersRooms.userID 
RIGHT JOIN rooms 
ON membersRooms.roomID = rooms.id 

然后在PHP中,你应该能够只是跟踪,当你MEMBERID的更改以及更改时间,开始新的选择。如果我没有完全贻误该SQL(我可能有),然后将得到的行应该是这个样子:

memberID | roomID | roomName | memberRoom 
    1    1   foo    1 
    1    2   bar    1 
    2    1   foo    1 
    2    2   bar    1 

所以你的循环迭代,你会使用roomID和ROOMNAME建立自己的选择,如果RoomID匹配memberRoom然后你会选择该行。

0

$房查询而死 同时运行一次把这个$rooms = mysql_query("SELECT * FROM rooms");查询行 在第一,而

0

OK,让你从3个表需要信息而

时间 - 成员,房间和membersRooms 。成员和成员的行数1:1排队,因此我们可以使用1个查询来获得这两个数据。

该方法将最小化查询所需的数量 - 如果您看到自己在循环中查询数据库,请问问自己是否有更好的方法。

$member_query = mysql_query("SELECT * FROM members LEFT JOIN membersRooms ON (members.id = membersRooms.userID)"); 

$room_query = mysql_query("SELECT * FROM rooms"); 
$rooms = array(); 
while ($room = mysql_fetch_assoc($room_query)) 
    $rooms[] = $room; 

while ($member = mysql_fetch_assoc($member_query)) { 
    echo '<select>'; 
    foreach($rooms as $room) { 
    echo "<option value='{$room['roomID']}' "; 
    if ($member['roomID'] == $room['id']) 
     echo 'selected="selected"'; 
    echo ">{$room['roomName']}</option>"; 
    } 
    echo '</select>'; 
} 

值得一提的是,如果会员:房间是1:许多关系,你并不需要使用第三个表加入他们的行列 - 只需添加一个roomId成员,和你的罚款。