2011-12-15 73 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成員,和你的罰款。