Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Użytkownicy i grupy - pętla w pętli.
Jediii
post
Post #1





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 21.09.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
BaN
post
Post #2





Grupa: Zarejestrowani
Postów: 158
Pomógł: 43
Dołączył: 9.11.2007

Ostrzeżenie: (0%)
-----


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"
Go to the top of the page
+Quote Post
Jediii
post
Post #3





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 21.09.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
kefirek
post
Post #4





Grupa: Zarejestrowani
Postów: 781
Pomógł: 256
Dołączył: 29.06.2008

Ostrzeżenie: (0%)
-----


  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.  
Go to the top of the page
+Quote Post
Jediii
post
Post #5





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 21.09.2011

Ostrzeżenie: (0%)
-----


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.  
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 04:55