Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Drzewo PHP + MYSQL + JS
Forum PHP.pl > Forum > PHP
gucio1
Witam,
napisałem mini portal do którego można zarejestrować się podając maila osoby która nas poleciła podczas rejestracji.
Skrypt automatycznie przypisuje naszemu rekordowi w bazie maila tej osoby dzięki której założyliśmy konto.

Nasz rekord w bazie wygląda mniej więcej tak:

Imię Nazwisko Email hasło osobap(emal osoby polecajacej)
Jan Kowalski jak.kowalski@wp.pl jojpoejpfw rysiek.nowak@wp.pl

I teraz tworze drzewo poleceń.
Pobieram maila zalogowanego użytkownika (rysiek.nowak@wp.pl) i wyświetlam pod nim wszystkie maile jeden pod drugim które mają w bazie jako "osobap" email rysiek.nowak@wp.pll i są to osoby które założyły konto dzięki Ryśkowi.

Ale zanim pobiorę wszystkie tę maile po wczytaniu pierwszego rekordu z bazy dajmy na to "Jana" daje następną pętle która sprawdza czy "syn" Ryśka Jan też ma osoby pod sobą i dla nich też wyświetla jego "synów" i tak do 4 poziomów.

Napisałem strasznie słaby skrypt metodą kombinowania żeby tylko działał. Użyłem spacji żeby tworzyła się struktura drzewiasta smile.gif .

Wynik skryptu wygląda tak:

Rysiek twoje drzewo:

jan.kowalski@wp.pl
---------marlena@er.pl
---------jacek.dobry@ert.pl
milena@tralala.pl
andrzej@te.pl
---------michal@rerer.pl
---------grazyna@wewewe.pl
------------------bronislaw@perrt.pl
------------------czarek@resergr.pl
mietek@wp.pl

itd...

Jeszcze jest dodana zmiana koloru wyświetlenia zależnie od tego czy użytkownik jest aktywny czy nie ale to nie jest ważne.

I z góry uprzedzam pytania, tak wiem że to wszystko mogło by być w jednej pętli.

I tak: chciałbym żeby wyświetlenie było bardziej profesjonalne i ruchome. Czyli wyświetlają się tylko użytkownicy pod zalogowanym użytkownikiem i żeby wyświetlić synów tych użytkowników trzeba kliknąć plusik i następny plusik żeby wyświetlić następne poziomy. Wszystko połączone kreskami i ustawione poziomami. Jak np. tutaj: http://domanart.pl/dema/drzewo-plikow/index.php

Wiem że drzew jest pełno w sieci ale działają na zasadzie mam już pewną liczbę użytkowników wyświetlę ich JS'em i albo Ajax'em i jest ładne ruchome drzewo. Ale jeśli nie ma się ustalonej liczby użytkowników i ta liczba ciągle się zmienia to już dla mnie zaczynają się schodki.

Próbowałem przerabiać coś takiego ale nie wiem jak przekazać dane wyciągnięte z bazy do JS'a za pomocą phpa.
Czy w ogóle można łączyć phpa i JS'a?

Poniżej wklejam kod mojego skryptu.
Proszę o podpowiedzi jak z tego wybrnąć.

  1. <?php
  2.  
  3.  
  4.  
  5. //1 obrot
  6. $wynik = $polaczenie->query("SELECT * FROM uzytkownicy WHERE osobap='$email'");
  7. if ($wynik ->num_rows == 0) {
  8. echo "<p><b>".'<div class="error">'."Nikt jesszcze nie założył konta z twojego polecenia".'</div>';
  9. }
  10. else{
  11. echo "Witaj ".$email.", poniżej widzisz osoby które założyły konto z twojego polecenia.<br><br>";
  12. echo "Użytkownik: ".'<span style="color:green;">aktywny</span>/<span style="color:red;">nieaktywny</span><br><br>';
  13. }
  14.  
  15. $wynik = $polaczenie->query("SELECT * FROM uzytkownicy WHERE osobap='$email'");
  16. if ($wynik ->num_rows > 0)
  17. {
  18.  
  19. for($a = 1; $a <= $wynik ->num_rows; $a++) {
  20.  
  21.  
  22.  
  23. $row = $wynik ->fetch_assoc();
  24. if($row["aktywny"]>0){
  25. echo '<div class="zielony"><i class="fa fa-chevron-right" aria-hidden="true"></i> '.$row["email"].' <i class="fa fa-long-arrow-right" aria-hidden="true"></i> 10pkt </div>';
  26. }
  27. else{
  28. echo '<div class="error"><i class="fa fa-chevron-right" aria-hidden="true"></i> '.$row["email"].'</div>';
  29. }
  30. //2obrot
  31.  
  32. $zmienna_email = $row["email"];
  33.  
  34. $wynik_drugi = $polaczenie->query("SELECT * FROM uzytkownicy WHERE osobap='$zmienna_email'");
  35. if ($wynik_drugi ->num_rows > 0)
  36. {
  37. for($i = 1; $i <= $wynik_drugi ->num_rows; $i++) {
  38.  
  39. $row = $wynik_drugi ->fetch_assoc();
  40. if($row["aktywny"]>0){
  41. echo '<div class="zielony">&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;<i class="fa fa-level-down" aria-hidden="true"></i> '.$row["email"].' <i class="fa fa-long-arrow-right" aria-hidden="true"></i> 10pkt </div>';
  42. }
  43. else{
  44. echo '<div class="error">&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;<i class="fa fa-level-down" aria-hidden="true"></i> '.$row["email"].'</div>';
  45. }
  46.  
  47. //3obrot
  48. $zmienna_email3 = $row["email"];
  49.  
  50. $wynik_trzeci = $polaczenie->query("SELECT * FROM uzytkownicy WHERE osobap='$zmienna_email3'");
  51. if ($wynik_trzeci ->num_rows > 0)
  52. {
  53. for($i = 1; $i <= $wynik_trzeci ->num_rows; $i++) {
  54.  
  55. $row = $wynik_trzeci ->fetch_assoc();
  56.  
  57. if($row["aktywny"]>0){
  58. echo '<div class="zielony">&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;<i class="fa fa-level-down" aria-hidden="true"></i> '.$row["email"].' <i class="fa fa-long-arrow-right" aria-hidden="true"></i> 8pkt</div>';
  59. }
  60. else{
  61. echo '<div class="error">&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;<i class="fa fa-level-down" aria-hidden="true"></i> '.$row["email"].'</div>';
  62. }
  63. //4obrot
  64. $zmienna_email4 = $row["email"];
  65.  
  66. $wynik_czwarty = $polaczenie->query("SELECT * FROM uzytkownicy WHERE osobap='$zmienna_email4'");
  67. if ($wynik_czwarty ->num_rows > 0)
  68. {
  69. for($i = 1; $i <= $wynik_czwarty ->num_rows; $i++) {
  70.  
  71. $row = $wynik_czwarty ->fetch_assoc();
  72.  
  73. if($row["aktywny"]>0){
  74. echo '<div class="zielony">&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp&thinsp;&thinsp;&thinsp;&thinsp;<i class="fa fa-level-down" aria-hidden="true"></i> '.$row["email"].' <i class="fa fa-long-arrow-right" aria-hidden="true"></i> 8pkt </div>';
  75. }
  76. else{
  77. echo '<div class="error">&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;&thinsp;<i class="fa fa-level-down" aria-hidden="true"></i> '.$row["email"].'</div>';
  78. }
  79. }
  80. }
  81. }
  82. }
  83.  
  84. }
  85.  
  86.  
  87. }
  88.  
  89.  
  90.  
  91. }
  92. }
  93.  
  94. ?>



Kurcze, nikt nie jest w stanie pomóc?
nospor
Cytat
Próbowałem przerabiać coś takiego ale nie wiem jak przekazać dane wyciągnięte z bazy do JS'a za pomocą phpa.

  1. <?php
  2. $danaZBazy = 'CosZBazy';
  3. ?>
  4. <script>
  5. alert("<?= $danaZBazy ?>");
  6. </script>

Tada
gucio1
Ok już wiem jak wyświetlić daną z php w JS.

Teraz jak powiedzmy wyjmę z bazy, do pewnej zmiennej liczbę osób w z pierwszego poziomu metoda num_rows i jeden cały poziom do tablicy asocjacyjnej stworzę pętle w JS żeby wyświetlić kolejne osoby z poziomu.

To jak teraz zrobić żeby wyświetlić pierwszą osobę z tablicy w drzewie javascriptem potem znowu wczytać kolejną i znowu wyświetlić w drzewie?

Czy javascript nie potrzebuje już całej struktury pobranej z bazy np. do tablicy żeby wyświetlić drzewo z tego co ma?

Czy mogę pobierać kolejno osoby jak w moim skrypcie i dodawać do wyświetlenia?

nospor
Uzyj AJAX i wczytuj po jednym poziomie struktury. W ajax bedziesz przekazywal ID/email rekokordu dla ktorego chcesz pobrac dzieci
gucio1
Właśnie wczoraj wyczytałem że przez Ajax mogę łączyć się z baza.

Będę szukał jakiegoś wzoru i próbował przerabiać. Może ma ktoś coś sprawdzonego w formie drzewa?
com
Pierwsze co bym zmienił to te bazę danych zmienił, wtedy nie potrzebujesz wgl pętli a odpowiedni warunek przy pobieraniu rekordów.

czyli masz te tabele z
ID Imię Nazwisko Email hasło

i drugą

ID id_user id_osobap
gucio1
Co da rozbicie na dwie tabele? Wyjaśnij jak masz chwile.
daniel1302
Rozbicie na dwie tabele, da to, że w jednej będziesz trzymał fizyczne osoby a w drugiej strukturę Twojego drzewka smile.gif

Jeśli masz do kilku tysięcy rekordów to mozesz pobierać całość danych, generować strukturę drzewiastą i zapisywać do cache

I tak np dla takiej struktury:
  1. email1
  2. --email1.1
  3. --email1.2
  4. --email1.3
  5. --email1.3.1
  6. --email1.3.2
  7. email2
  8. email3
  9. --email3.1



generujesz sobie taką tablicę:
  1. [
  2. 'email11' => [
  3. 'email1.1' => [],
  4. 'email1.2' => [],
  5. 'email1.3' => [
  6. 'email1.3.1' => [],
  7. 'email1.3.2' => []
  8. ]
  9. ],
  10. 'email2' => []
  11. 'email3' => [
  12. 'email3.1' => []
  13. ]
  14.  
  15. ]



Jeszcze ładniej byś to zrobił sobie obiektami, że każdy element jest obiektem, które posiada strukturę z dziecmi, i jest np traversable.


Strukturę generujesz rekurencyjnie, przykładowa funkcja:
  1. public static function parseTree($tree, $root = null)
  2. {
  3. $return = array();
  4. foreach($tree as $key => $record) {
  5. if($record['parent'] == $root) {
  6. unset($tree[$key]);
  7. $return[] = array(
  8. 'id' => $record['id'],
  9. 'name' => $record['name'],
  10. 'alias' => ((isset($record['alias'])) ? $record['alias'] : ''),
  11. 'children' => self::parseTree($tree, $record['id']),
  12. 'description' => ((isset($record['description'])) ? $record['description'] : ''),
  13. 'weight' => (isset($record['weight'])) ? $record['weight'] : 0
  14. );
  15. }
  16. }
  17.  
  18. return empty($return) ? null : $return;
  19. }
gucio1
daniel1302, dzięki za podpowiedzi ale nie rozumiem trochę kodu od Ciebie. Mógł byś mi odrobinę wyjaśnić jak to będzie działać? Rozumiem że tworze sobie tablice i jeśli rodzic ma potomka to tworzę "podtablicę" itd. Chętnie to wykorzystam tylko nie bardzo potrafię. Bo jeśli się nie mylę to takie gotowe pobrane drzewo w tablicy mogę później wykorzystać w js? A gotowych wyświetleń w js jest masę które pobierają dane z (chyba)takiego drzewa.
miedzna
Np możesz zrobić tak: http://phpflow.com/php/dynamic-tree-with-j...-php-and-mysql/
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.