Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

3 Stron V  < 1 2 3 >  
Reply to this topicStart new topic
> Drzewka w PHP [rzseattle]
Seth
post 3.05.2004, 16:19:37
Post #21





Grupa: Przyjaciele php.pl
Postów: 2 335
Pomógł: 6
Dołączył: 7.03.2002

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


CZy ktos probowal pobrac sciezke do elementu drzewka ?

Czyli mamy dostac np:
Kod
array (

    [0] => root

    [0] => element_roota

    [0] => element_elementu_roota

)


Gdzie mamy takie drzewko:
Kod
root

|

-- element_roota

     |

     -- element_elementu_roota

Siedze juz od kilku godzin nd kodem i stanalem na tym - chyba czas odpoczac smile.gif

Jakby ktos mial SQLa do tej sciezki to byl bym wdzieczny za podrzucenie winksmiley.jpg
Go to the top of the page
+Quote Post
rzseattle
post 3.05.2004, 19:37:06
Post #22





Grupa: Przyjaciele php.pl
Postów: 554
Pomógł: 0
Dołączył: 4.04.2002
Skąd: Tychy

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


Nie no az takim wyjadaczem w SQLu nie jestem. Robie to zwyklym whilem pobieram rodzicow ( cutLevel pomiejszony o jedna cyfre ) dopoki nie dotre do korzenia. Zarzucilbym kodem ale juz operuje na dalszych stadiach rozoju tej teori (niestety nie mam czasu na arta) i kody by byly niekompatybilne.


--------------------
"Real children don't go hoppity-skip unless they are on drugs."
Go to the top of the page
+Quote Post
Seth
post 3.05.2004, 19:41:07
Post #23





Grupa: Przyjaciele php.pl
Postów: 2 335
Pomógł: 6
Dołączył: 7.03.2002

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


smile.gif

No coz zostaje mi wlasnie takie rozwiazanie. Jak dojde jak jednym zapytaniem wydobyc taka sciezke to podrzuce kod.
Go to the top of the page
+Quote Post
DhuCerbin
post 3.05.2004, 19:54:29
Post #24





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 10.06.2003

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


ja najpierw na podstawie numerka generuje numerki wszystkich rodziców [ w php ] i wysyłam zapytanie sql gdzie w [where] są podane te id. dla zabezpieczenia daje [limit] ;-)

Seth : post wyzej jest moje pytanie o to samo ;-)
Go to the top of the page
+Quote Post
Seth
post 3.05.2004, 19:57:24
Post #25





Grupa: Przyjaciele php.pl
Postów: 2 335
Pomógł: 6
Dołączył: 7.03.2002

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


Zmeczenie robi swoje.. nie zauwazylem tego smile.gif
Go to the top of the page
+Quote Post
eXtreme
post 11.05.2004, 17:51:30
Post #26





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 14.06.2002

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


Mógłby ktoś zarzucić kodem jak rozwiązał ta ścieżkę? Głowię się nad tym i nie wiem jak to zrobić sad.gif
Go to the top of the page
+Quote Post
DhuCerbin
post 11.05.2004, 19:34:01
Post #27





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 10.06.2003

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


Majac dane numerek tego jednego, robisz na nim operacje :
ucinasz ostatnią niezerową liczbę i zamieniasz ja na zaero, zapisujesz w tablicy, dopóki nie osiagniesz 10000...
Wtedy wszystkie elementy tablicy podajesz jako parametr dla where w zapytaniu :

[sql:1:7d24544c0e]
SELECT * FROM tree WHERE pid=$arr[0] OR pid=$arr[1] OR ...
[/sql:1:7d24544c0e]
Go to the top of the page
+Quote Post
invx
post 12.05.2004, 18:25:50
Post #28





Grupa: Zablokowani
Postów: 655
Pomógł: 0
Dołączył: 28.11.2003
Skąd: Zagórz

Ostrzeżenie: (80%)
XXXX-


i o takie drzewka moge napisac system frum hyba, nie questionmark.gif


--------------------
RCXcms
www.rcx.prv.pl
Pierwszy polski w pełni zintegrowany system portal
Go to the top of the page
+Quote Post
scanner
post 12.05.2004, 19:33:24
Post #29





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




invx: jeszcze jeden taki post i Twoje nabijanie postów zakończy Administrator.
Jeżeli masz problem, to go sprecyzuj. Od rozmów o dupie Maryny jest hydepark.


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
invx
post 12.05.2004, 20:07:04
Post #30





Grupa: Zablokowani
Postów: 655
Pomógł: 0
Dołączył: 28.11.2003
Skąd: Zagórz

Ostrzeżenie: (80%)
XXXX-


przeczytalem artykul, i z niego wywnioskowuje, ze mozna drzewka zastosowac do napisania skryptu do forum. tylko nie spotkalem sie z forum na drzewkach, i nie wiem cy dobrze mysle. :?

P.S.
na hydeparku mialem zapytac o kilka rzezcy ale sie wlasnie powstrzymuje, zeby nie byc osadzonym o nabijanie...


--------------------
RCXcms
www.rcx.prv.pl
Pierwszy polski w pełni zintegrowany system portal
Go to the top of the page
+Quote Post
treewood
post 15.05.2004, 10:41:39
Post #31





Grupa: Zarejestrowani
Postów: 215
Pomógł: 0
Dołączył: 18.01.2003

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


No moim zdaniem metoda w tym artykule jest troche ograniczona (glebia). Ja od dosc dawna stosuje metode 5 zaprezentowana na http://www.depesz.pl/various-sqltrees.php.

w niej nie ma tego typu ograniczen i jest moim zdaniem lepsza. bardzo proste przenoszenie podgrup do innej nadgrupy itd itp


--------------------
Działam w OpenSolution.org, autor Quick.Cms i Quick.Cart już od ponad 10 lat
Go to the top of the page
+Quote Post
eXtreme
post 16.05.2004, 16:13:25
Post #32





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 14.06.2002

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


Ale trzeba mieć Postgresa a nie każdy go ma.
Go to the top of the page
+Quote Post
slaw:)
post 27.05.2004, 20:32:39
Post #33





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 6.02.2004

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


Zgadza sie, zeby metoda depesza dzialala pgsql musi byc. a ma ktos moze wersje na mysql-a? bylbym bardzo wdzwieczny smile.gif. Bo potrzebne mi sa drzewka, ale tak sie zastanawiam, bo jednak to ograniczenie do 9 dzieci to jednak troche malo w katalogu produktow.
Chetnie bym to sam przerobil, ale jeszcze nie ten czas, nie ta pora (chociac moze wcale az takie to trudne nie jest?).

pozdrawiam
Go to the top of the page
+Quote Post
rzseattle
post 27.05.2004, 21:03:56
Post #34





Grupa: Przyjaciele php.pl
Postów: 554
Pomógł: 0
Dołączył: 4.04.2002
Skąd: Tychy

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


Niestety nie mam czasu narazie aby dostawic druga czesc arta bo goni mnie wszystko opocz biegunki smile.gif. Ale widze ze komus moze sie to przydac (i wszyscy wieszaja psy na klasie do rozwiniecia) wiec umieszczam wersje obslugujaca 99 cioro dzieci , a jesli ktos zechce to w piec minut przerobi ja na wersje z mozliwoscia dopisania 999 cioro dzieci do rodzica. Klasa nie wyglada jeszcze tak jakbym chcial ale mysle ze wybaczycie mi drobne niedociagniecia winksmiley.jpg . Jak tylko na uczelni zostawia mnie w spokoju to opisze klase , sprawie by jakos wygladala i dodam pare przydatnych metod.
  1. <?php
  2. class trees{
  3.  
  4. var $maxNest = 5; //liczone od zera()
  5. var $table = &#092;"groups\";
  6. var $digitsPerSub = 2;
  7.  
  8. function trees(){
  9.  
  10. $this->db =& new db;
  11.  
  12. $this->levelNum = $this->maxNest*$this->digitsPerSub;
  13.  
  14. return true;
  15. }
  16.  
  17. function newGroup( $name ){
  18.  
  19. return $this->db->execute(&#092;"INSERT INTO \".$this->table.\" ( cluster, name, level, depth ) SELECT MAX(cluster)+1,'\".$name.\"', RPAD('0',\".$this->levelNum.\",'0'), 0 FROM \".$this->table.\" \");
  20.  
  21. }
  22.  
  23. function newChild( $name, $parentId ){
  24.  
  25. $parent = $this->db->getRow(&#092;"select cluster, LEFT(level, depth*2) as cutLevel, depth FROM \".$this->table.\"
  26. WHERE RIGHT(level,2) != '99' AND
  27. id=&#092;".$parentId);
  28.  
  29. if(!$parent){return false;}
  30.  
  31. return $this->db->execute(&#092;" insert into \".$this->table.\" (cluster, name, level, depth ) select \".$parent['cluster'].\", '\".$name.\"', RPAD( CONCAT( '\".$parent['cutLevel'].\"' ,LPAD( SUBSTRING(g.level, (\".$parent['depth'].\"*2)+1, 2 ) + 1, 2, '0')), \". $this->levelNum .\", '0'),\".$parent['depth'].\"+1
  32. FROM &#092;".$this->table.\" AS g
  33. LEFT JOIN &#092;".$this->table.\" AS p ON CONCAT(g.cluster,'|',RPAD( CONCAT( '\".$parent['cutLevel'].\"' ,LPAD( SUBSTRING(g.level, (\".$parent['depth'].\"*2)+1, 2 ) + 1, 2, '0')), \". $this->levelNum .\", '0')) = CONCAT(p.cluster,'|',p.level)
  34. where g.cluster = &#092;".$parent['cluster'].\" and
  35. g.level like CONCAT( '\".$parent['cutLevel'].\"','%') and
  36. (&#092;".$parent['depth'].\"*2) + 2 <= \".$this->levelNum.\" and
  37. p.level is null
  38. LIMIT 1&#092;");
  39. }
  40.  
  41. function delete( $id ){
  42.  
  43. $r = $this->db->getRow(&#092;"SELECT cluster, LEFT(level, depth*2) as cutLevel,depth
  44. FROM &#092;".$this->table.\"
  45. WHERE id=&#092;".$id);
  46. if(!$r){return false;}
  47.  
  48. return $this->db->execute(&#092;"DELETE
  49.  FROM &#092;".$this->table.\"
  50.  WHERE LEFT( level, &#092;".$r['depth'].\"*2)='\".$r['cutLevel'].\"' AND
  51.  cluster =&#092;".$r['cluster']);
  52.  
  53. }
  54. function getAll( $cluster , $depth = null ){
  55.  
  56. $depth = (is_null($depth))?$this->maxNest:$depth;
  57.  
  58. return $this->db->getArray(&#092;"SELECT *, depth
  59. FROM &#092;".$this->table.\"
  60. WHERE cluster = &#092;".$cluster.\" AND
  61. depth <= &#092;".$depth.\"
  62. ORDER BY level&#092;");
  63. }
  64.  
  65.  
  66. function getPart( $parent_id, $depth = null ){
  67.  
  68. $depth = (is_null($depth))?$this->maxNest:$depth;
  69.  
  70. $r = $this->db->getRow(&#092;"SELECT cluster, LEFT(level, depth*2 ) as cutLevel, depth
  71. FROM &#092;".$this->table.\"
  72. WHERE id=&#092;".$parent_id
  73. );
  74.  
  75. if(!$r){return false;}
  76.  
  77. return $this->db->getArray(&#092;"
  78. SELECT *, depth, depth - &#092;".$r['depth'].\" as relativeDepth
  79. FROM &#092;".$this->table.\"
  80. WHERE cluster = &#092;".$r['cluster'].\" AND
  81. LEFT (level, &#092;".$r['depth'].\"*2) = '\".$r['cutLevel'].\"' AND
  82. depth <= (&#092;".$depth.\"+\".$r['depth'].\")
  83. ORDER BY level&#092;");
  84.  
  85. }
  86.  
  87. }
  88.  
  89. ?>


i dodajcie kolumne depth (int) do poprzedniej tabeli winksmiley.jpg


--------------------
"Real children don't go hoppity-skip unless they are on drugs."
Go to the top of the page
+Quote Post
treewood
post 28.05.2004, 10:06:58
Post #35





Grupa: Zarejestrowani
Postów: 215
Pomógł: 0
Dołączył: 18.01.2003

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


jakiego znow postrgresa? ja ta metode uzylem w MySQL ... i zamiast niektorych operacji na bazie przenioslem je do php ... proste i skuteczne


--------------------
Działam w OpenSolution.org, autor Quick.Cms i Quick.Cart już od ponad 10 lat
Go to the top of the page
+Quote Post
123tomek
post 16.11.2004, 14:39:37
Post #36





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 19.10.2004

Ostrzeżenie: (10%)
X----


Moze mi ktos podpowiedziec jak zmodyfikowac ten przyklad zeby uzyskac cos takiego:


Windows
- NoNT
-- Win95
-- Win98
-- Win Milenium
- NT
Linux

Chce uzyc tego do zrobienia menu. Najpierw musze pobrac id glownych galezi (Windows, Linux) by wyswietlic je jako menu glowne. Potem chce by po kliknieciu na dana galaz wybrane zostaly kolejne podmenu (windows-> NoNT i NT) i w kolejnym kroku znowu po kliknieciu na NoNT maja sie rozwinac kolejno win95,98 i me. Po kliknieciu na np. na me ma sie otworzyc juz strona z zawartoscia.
Mam zamiar w bazie przechowywac nazwy plikow php (lub cale linki) do ktorych ma sie odwolac galaz ktora jest ostatnia (win 95,98,me) i otwierac okno z zawartoscia. Do tego oczywiscie menu ma miec rozne poziomy zagniezdzenia np. po kliknieciu w NT zamiast rozwijac galaz ma juz pokazywac sie strona.

Ratuje mnie samo przerobienie selecta lecz idealnym byloby dorzucenie kawalka kodu ktory juz realizuje to menu wraz zwybieraniem linkow

Ten post edytował 123tomek 16.11.2004, 14:40:18
Go to the top of the page
+Quote Post
Vengeance
post 16.11.2004, 15:00:16
Post #37





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


http://www.forum.kasart98.com/viewtopic.php?t=9414


--------------------
Go to the top of the page
+Quote Post
aszlej
post 17.01.2005, 21:26:34
Post #38





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

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


Witam!

Od wczoraj nad tym siedze, ale za nic nie moge dojsc dlaczego nie dziala mi dodawanie nowego dziecka :/ Moge zakladac glowne kategorie, ale gdy probuje to zrobic poprzez funkcje newChild nie dzieje sie nic. Probowalem dawac zapytania na echo itd, ale nie ma tam bledu - wszystkie funkcje zwracaja true.

Funkcje wywoluje tak:

$tree->newChild('Amerykanskie', 1); // Bo chce dodac np. subkategorie 'Amerykanskie' do kategorii samochody (ID 1).

Bardzo prosze o pomoc - jest to dla mnie bardzo wazne.

Z gory dzieki!
Go to the top of the page
+Quote Post
rzseattle
post 22.01.2005, 14:33:06
Post #39





Grupa: Przyjaciele php.pl
Postów: 554
Pomógł: 0
Dołączył: 4.04.2002
Skąd: Tychy

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


sugestia nr 1

Zmien metode newCHild na

  1. <?php
  2.  
  3.  function newChild( $name, $parentId ){
  4.  
  5. $parent = $this->db->getRow(&#092;"select cluster, LEFT(level, depth*2) as cutLevel, depth FROM \".$this->table.\"
  6. WHERE RIGHT(level,2) != '99' AND
  7. id=&#092;".$parentId);
  8.  
  9. if(!$parent){return false;}
  10.  
  11. print &#092;"select \".$parent['cluster'].\", '\".$name.\"', RPAD( CONCAT( '\".$parent['cutLevel'].\"' ,LPAD( SUBSTRING(g.level, (\".$parent['depth'].\"*2)+1, 2 ) + 1, 2, '0')), \". $this->levelNum .\", '0'),\".$parent['depth'].\"+1
  12. FROM &#092;".$this->table.\" AS g
  13. LEFT JOIN &#092;".$this->table.\" AS p ON CONCAT(g.cluster,'|',RPAD( CONCAT( '\".$parent['cutLevel'].\"' ,LPAD( SUBSTRING(g.level, (\".$parent['depth'].\"*2)+1, 2 ) + 1, 2, '0')), \". $this->levelNum .\", '0')) = CONCAT(p.cluster,'|',p.level)
  14. where g.cluster = &#092;".$parent['cluster'].\" and
  15. g.level like CONCAT( '\".$parent['cutLevel'].\"','%') and
  16. (&#092;".$parent['depth'].\"*2) + 2 <= \".$this->levelNum.\" and
  17. p.level is null
  18. LIMIT 1&#092;";
  19.  
  20. return $this->db->execute(&#092;" insert into \".$this->table.\" (cluster, name, level, depth ) select \".$parent['cluster'].\", '\".$name.\"', RPAD( CONCAT( '\".$parent['cutLevel'].\"' ,LPAD( SUBSTRING(g.level, (\".$parent['depth'].\"*2)+1, 2 ) + 1, 2, '0')), \". $this->levelNum .\", '0'),\".$parent['depth'].\"+1
  21. FROM &#092;".$this->table.\" AS g
  22. LEFT JOIN &#092;".$this->table.\" AS p ON CONCAT(g.cluster,'|',RPAD( CONCAT( '\".$parent['cutLevel'].\"' ,LPAD( SUBSTRING(g.level, (\".$parent['depth'].\"*2)+1, 2 ) + 1, 2, '0')), \". $this->levelNum .\", '0')) = CONCAT(p.cluster,'|',p.level)
  23. where g.cluster = &#092;".$parent['cluster'].\" and
  24. g.level like CONCAT( '\".$parent['cutLevel'].\"','%') and
  25. (&#092;".$parent['depth'].\"*2) + 2 <= \".$this->levelNum.\" and
  26. p.level is null
  27. LIMIT 1&#092;");
  28. } 
  29. ?>


Zobacz czy wyprintowane zapytanie dziala na bazie danych czy nie wywala bledow. I co wazniejsze czy zwraca jakis rezultat.

Jesli nie to:

sugestia nr 2
Jesli mozesz to daj link do zrzutu bazy.


--------------------
"Real children don't go hoppity-skip unless they are on drugs."
Go to the top of the page
+Quote Post
aszlej
post 22.01.2005, 15:19:07
Post #40





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

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


Tak jak mowie probówałem już dawać zapytanie na ekran.. Wkleje Ci to co zwraca wywolanie jej poprzez $tree->newChild('Amerykanskie', 1); :

Kod
select 0, 'Amerykanskie', RPAD( CONCAT( '' ,LPAD( SUBSTRING(g.level, (0*2)+1, 2 ) + 1, 2, '0')), 0, '0'),0+1 FROM groups AS g LEFT JOIN groups AS p ON CONCAT(g.cluster,'|',RPAD( CONCAT( '' ,LPAD( SUBSTRING(g.level, (0*2)+1, 2 ) + 1, 2, '0')), 0, '0')) = CONCAT(p.cluster,'|',p.level) where g.cluster = 0 and g.level like CONCAT( '','%') and (0*2) + 2 <= 0 and p.level is null LIMIT 1


Zrzut bazy:

Kod
CREATE TABLE `groups` (
  `id` int(11) NOT NULL auto_increment,
  `cluster` int(11) NOT NULL default '0',
  `name` varchar(100) NOT NULL default '',
  `level` decimal(10,0) NOT NULL default '0',
  `depth` int(11) NOT NULL default '0',
  UNIQUE KEY `id` (`id`)
) TYPE=MyISAM AUTO_INCREMENT=48;

--
-- Dumping data for table `groups`
--

INSERT INTO `groups` VALUES (1, 0, 'Samochody', 0, 0);


Z góry dzięki za pomoc, gdyż ten błąd blokuje mi pisanie pewnego ważnego modułu :].
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 10.11.2024 - 18:50