Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Użytkownicy i grupy - pętla w pętli.
Forum PHP.pl > Forum > Przedszkole
Jediii
Zakładając taką sytuację:

Mamy grupę użytkowników, gdzie każdy z nich może należeć do jakieś grupy lub kilku grup.
Podczas jego edycji chcemy, aby w polu typu select pojawiły się wszystkie grupy, a te, do których należy będą posiadały atrybut "selected" z wartością "true".
Oczywiście użytkowników oraz grupy trzymamy w osobnych tabelkach w bazie danych.

Pierwsze co mi przyszło na myśl, to:
1. Pobranie wszystkich grup z bazy danych.
2. Następnie pobieramy grupy, do których użytkownik należy.
3. I teraz za pomocą 2 pętli przelatujemy przez wszystkie grupy oraz grupy użytkownika porównując je ze sobą. Jeżeli będą takie same, to pokaż option z odpowiednim atrybutem.

Kod:
  1. echo '<select name="group[]" size="'.count($allGroups).'" multiple="yes">';
  2. foreach ($allGroups as $group)
  3. {
  4. foreach ($userGroups as $userGroup)
  5. {
  6. if ($userGroup->group_name == $group->group_name)
  7. {
  8. echo '<option value="'.$group->id_group.'" selected="true">'.$group->group_name.'</option>';
  9. }
  10. else
  11. {
  12. echo '<option value="'.$group->id_group.'">'.$group->group_name.'</option>';
  13. }
  14. }
  15. }
  16. echo '</select>';
  17. }


Niestety nie działa to jak trzeba. Pola, do których należy użytkownik są zaznaczone, więc jest ok, ale zamiast np. 5 grup, które mam w bazie pokazuje się ich znacznie więcej (powtarzają się) i nie mam pojęcia dlaczego. Mam nadzieję, że choć trochę mi pomożecie.
BaN
Jak już tak chcesz mieć, to musisz zmienić pętle, w drugiej musisz sprawdzać czy należy do grupy i zaznaczyć opcję
  1. echo '<select name="group[]" size="'.count($allGroups).'" multiple="yes">';
  2. foreach ($allGroups as $group) {
  3. echo '<option value="'.$group->id_group.'"';
  4. foreach ($userGroups as $userGroup) {
  5. if ($userGroup->group_name == $group->group_name) {
  6. echo ' selected="selected"';
  7. break;
  8. }
  9. }
  10. echo '>'.$group->group_name.'</option>';
  11. }
  12. echo '</select>';
  13. }


Ale moim zdaniem można z dużym prawdopodobieństwem zrobić to jednym zapytaniem, nie wiadomo jakie są tabele i jak nazywają się pola w bazie, więc przyjąłem jakieś nazwy
  1. $sql = "SELECT g.group_id,g.group,ug.user_id
  2. FROM groups AS g
  3. LEFT JOIN users_group AS ug ON (ug.group_id=g.group_id AND user_id={$user_id}
  4. ORDER BY g.group"
Jediii
Dziękuję za zainteresowanie z Twojej strony.

Cytat(BaN @ 24.05.2012, 00:00:05 ) *
Jak już tak chcesz mieć, to musisz zmienić pętle, w drugiej musisz sprawdzać czy należy do grupy i zaznaczyć opcję


Zamieniłem drugą pętlę na pętle for:

  1. echo '<select name="group[]" size="'.count($allGroups).'" multiple="yes">';
  2. foreach ($allGroups as $group)
  3. {
  4. for ($i=0; $i<count($groups); $i++) //wszystkie grupy, do których należy user są w przechowywane w tablicy
  5. {
  6. if ($groups[$i] == $group->group_name)
  7. {
  8. echo '<option value="'.$group->id_group.'" selected="true">'.$group->group_name.'</option>';
  9. }
  10. else
  11. {
  12. echo '<option value="'.$group->id_group.'">'.$group->group_name.'</option>';
  13. }
  14. }
  15. }
  16. echo '</select>';


Niestety nadal nie działa to prawidłowo. Każdą grupę wypisuje mi po 3 razy, ale grupy użytkownika są prawidłowo zaznaczone.

Cytat
Ale moim zdaniem można z dużym prawdopodobieństwem zrobić to jednym zapytaniem, nie wiadomo jakie są tabele i jak nazywają się pola w bazie, więc przyjąłem jakieś nazwy
  1. $sql = "SELECT g.group_id,g.group,ug.user_id
  2. FROM groups AS g
  3. LEFT JOIN users_group AS ug ON (ug.group_id=g.group_id AND user_id={$user_id}
  4. ORDER BY g.group"


Posiadam 3 tabele: użytkownicy, grupy oraz grupy_użytkowników, gdzie ostatnia z nich posiada klucze obce pierwszych dwóch tabel.
kefirek
  1. echo '<select name="group[]" size="'.count($allGroups).'" multiple="yes">';
  2. foreach ($allGroups as $group)
  3. {
  4. for ($i=0; $i<count($groups); $i++) //wszystkie grupy, do których należy user s&plusmn; w przechowywane w tablicy
  5. {
  6. $selected = ($groups[$i] == $group->group_name ? 'selected="selected"': '');
  7. }
  8.  
  9.  
  10.  
  11. echo '<option value="'.$group->id_group.'" "'.$selected.'">'.$group->group_name.'</option>';
  12.  
  13.  
  14. }
  15. echo '</select>';
  16.  
Jediii
Nie mam pojęcia dlaczego, ale nie działa to nadal prawidłowo, jednak bardzo dziękuję, bo rozjaśniło mi to sprawę. Do tego poniższego kodu przed zamknięciem pętli foreach dodałem poniższą linijkę i wszystko działa prawidłowo.
  1. $selected = '';


Cytat(kefirek @ 24.05.2012, 19:37:42 ) *
  1. echo '<select name="group[]" size="'.count($allGroups).'" multiple="yes">';
  2. foreach ($allGroups as $group)
  3. {
  4. for ($i=0; $i<count($groups); $i++) //wszystkie grupy, do których należy user s&plusmn; w przechowywane w tablicy
  5. {
  6. $selected = ($groups[$i] == $group->group_name ? 'selected="selected"': '');
  7. }
  8.  
  9.  
  10.  
  11. echo '<option value="'.$group->id_group.'" "'.$selected.'">'.$group->group_name.'</option>';
  12.  
  13.  
  14. }
  15. echo '</select>';
  16.  
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.