2011-12-15 4 views
0

Я получилпоиска элемента в массиве PHP

  • таблицы пользователей с именем «члены»
  • за столом номера, названная «комната»
  • таблица, которая связывает идентификатор пользователя с идентификаторами из комнаты «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, делает кошек-пистолетов DBAs. –

+0

Вы уверены, что тип данных обоих одинаковый, и действительно ли вам нужно это сделать? Работает ли она без строгой проверки типов, разрешенной для вызова in_array? Попробуйте удалить этот третий «истинный» параметр из вызова in_array и посмотреть, работает ли он. –

+0

нет, он не работает ... и да, они все int @DigitalPrecision Мне нужно выпадающее меню для каждого пользователя .. как мне это сделать? – Janky

ответ

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 Соответствующий членRoom, тогда вы выберете эту строку. в то время как

+0

+1 для соединения.Если схема позволяет это, сразу же получите данные, которые вам нужны прямо из источника, а также выдавать запрос для каждой итерации цикла. –

0

$ комнаты запрос мертв пока работает только время в то время как

поставить эту строку $rooms = mysql_query("SELECT * FROM rooms"); запроса в первом, а

+1

Хотя это и исправит его проблему, это также сделает его скрипт существенно * менее эффективным –

0

ОК, так что вам нужна информация от 3-х таблиц - членов, комнаты, и membersRooms , Строки из членов и membersRooms выстраиваются в линию 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 членов, и все в порядке.

+0

вы написали «Строки из членов и членовRooms line up 1: 1», может быть, я не объяснил хорошо ... один член может быть связан в более чем одном номере! – Janky

+0

это печатает один для каждого участника – Janky