Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Rekurencja uzytkownicy, Listowanie podleglych użytkowniów
graffiti333
post 16.06.2010, 19:56:42
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 16.06.2010

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


Witam


Wykombinowałem taką funkcje podającą id uzytkownikow podleglych pod parrent_id


  1. function getSubUsersId($id){
  2.  
  3. $q = mysql_query("select u.id from users u where u.id_parrent_user = ".$id."" );
  4.  
  5. while ($uQ = mysql_fetch_array($q, MYSQL_ASSOC)){
  6.  
  7. echo $uQ['id'].",";
  8.  
  9. getSubUsersId($uQ['id']);
  10.  
  11. }
  12.  
  13. }
  14.  
  15. $id = 9;
  16. getSubUsersId($id);


funkcja podaje mi prawidłowo 8,9,11,13,14,12,10,17,

jak mam zapisać to do tablicy ?

Pozdrawiam


Go to the top of the page
+Quote Post
Fifi209
post 16.06.2010, 21:25:36
Post #2





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


np. static albo global ;]


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
thek
post 16.06.2010, 21:39:43
Post #3





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




A może zamiast kombinować z kilkunastoma zwrotkami i potem jechać while dałbyś w zapytaniu where jakieś id group by to id i w select group_concat? Dostałbyś także wszystkie id odzielone przecinkami i potem już można się bawić, przykładowo konwertując string do tablicy funkcją explode. Zresztą w Twojej wersji też explode można użyć.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
graffiti333
post 16.06.2010, 22:20:28
Post #4





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 16.06.2010

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


explode nie wyjdzie bo funkcja nie zwraca tylko wyrzuca na ekran po koleji 2,2,3,4,5,67,
Go to the top of the page
+Quote Post
thek
post 16.06.2010, 23:15:25
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Skoro Ci zależy tylko i wyłącznie na znalezieniu userów podległych jedynie konkretnemu innemu o nie prościej użyć:
  1. function zalezni( $id ) {
  2. if( !ctype_digit( $id ) )
  3. return FALSE;
  4. $sql = 'SELECT GROUP_CONCAT( u.id ) AS userzy FROM users AS u WHERE u.id_parent_id = '.$id.' GROUP BY u.parent_id';
  5. $resource = mysql_query($sql);
  6. if( $resource AND mysql_num_rows($resource) > 0 )
  7. return explode( ',', mysql_result( $resource, 0, 0 ) );
  8. else
  9. return FALSE;
  10. }
Inaczej to nieco wygląda jeśli chcesz jeszcze rekurencyjnie sprawdzać, czy pod jakiegoś do tego podległego nie ma podległego kolejnego. Wtedy bowiem bliższe jest Twojemu rozwiązaniu jeśli zachowamy strukturę bazy bez zmian. Zmiany nastąpią w nieco innym podejściu do danych. Zamiast echo pojawi się zapis do tablicy, sama tablica pojawi jako parametr funkcji także.
  1. function getSubUsersId($id, &$table){
  2. $q = mysql_query('SELECT id FROM users WHERE id_parrent_user = '.$id );
  3. while ($uQ = mysql_fetch_assoc($q)){
  4. $table[] = $uQ['id'];
  5. getSubUsersId($uQ['id'], $table);
  6. }
  7. }
  8. $id = 9;
  9. $wynik = array();
  10. getSubUsersId($id, $wynik);

Od razu mówię, że nie jest to optymalne co robisz i moim zdaniem niepoprawne, bo tworzysz do bazy wiele zapytań zbędnych, które nic nie zwrócą. Do tego kompletnie gubisz zależności. Nie wiesz co jest bezpośrednim podwładnym a co podwładnym podwładnego podwładnego winksmiley.jpg Uwierz, że da się to zrobić lepiej na wiele sposobów, w tym przynajmniej jeden taki, że poślesz jedno zapytanie do bazy, a resztę obrobisz już po stronie PHP. Będziesz tylko sobie "gałązkami manipulował". Lepsze jednak dla wszelkich rekurencyjnych zależności są zmiany w bazie. Poczytaj o drzewkach ip choćby. Optymalizować trzeba pod konkretne zastosowanie i nie ma jednej dobrej metody na wszystkie możliwe warianty.
Powód edycji: [thek]: W przeróbce Twojej metody nie chciałem się już bawić w walidację ( ctype_digit w pierwszym kodzie )


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
DiH
post 15.10.2010, 22:55:20
Post #6





Grupa: Zarejestrowani
Postów: 251
Pomógł: 34
Dołączył: 7.01.2010

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


Męczyłem się z dobre dwa dni z funkcją rekurencyjną i nie wiedziałem, czemu nie działa, aż znalazłem ten temat. Dzięki thek!
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 Wersja Lo-Fi Aktualny czas: 20.07.2025 - 05:44