поиск элемента в массиве php - PullRequest
0 голосов
/ 15 декабря 2011

У меня есть

  • таблица пользователей с именем "members"
  • таблица комнат с именем "комнаты"
  • таблица, которая связывает идентификатор пользователя с идентификаторами комнат "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>");
}

Ответы [ 3 ]

2 голосов
/ 15 декабря 2011

Чтобы сделать это немного легче для вас, вы можете попробовать использовать левые и правые соединения в вашей базе данных.Это значительно уменьшит нагрузку на ваш сервер и все еще позволит вам выполнять ту же функцию.

Я считаю, что если я правильно читаю структуру вашей базы данных, вам нужно что-то вроде:

 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 голосов
/ 15 декабря 2011

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

Стоит отметить, что если члены: rooms это отношение 1: многие, вам не нужно использовать третью таблицу, чтобы присоединиться к ним - просто добавьтеroomId для участников, и вы в порядке.

0 голосов
/ 15 декабря 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...