Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MYSQL]System Administracji Stronami, Problem z zapytaniami do aktualizacji drzewa stron
little_MASTER
post 26.05.2009, 20:22:53
Post #1





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 8.12.2008

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


Witam wszystkich!
Pisze prosty system cms dla mojej szkoły.
Struktura tabeli wygląda tak:


Jak widać pola id, id_nadrzednej, kolejnosc. Reszta to już dodatki snitch.gif

Na stronie prezentuje sie to tak:


Dezaktywowanie strony, tzn ustawianie statusu na offline działa dla strony i wszystkich podstron.

Mam problem natomiast z edycją samego położenia stron i ich kolejności.

Przykład:
Chcemy stronę o tytule abc(id=2) przenieść poniżej def (id=4) czyli byśmy musieli zamienić ich kolejności.
Pracuje nad jedną kwerendą która coś takiego zrobi (jako argument będe podawał tylko id strony która ma iść do góry), nie jest to aż tak skomplikowane,
problemem dla mnie jest przestawianie stron w głąb drzewa lub na zewnątrz.
Czyli np stronę Ostatnia (id=14) chcemy wsunąć w DDD (id=11).

Może podpowiecie jak w ogóle rozwiązać tego typy problem. Dopiero co zaczynam przygodę z cms'ami więc wolę uczyć się od najlepszych
Go to the top of the page
+Quote Post
erix
post 26.05.2009, 20:27:26
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Google: drzewka php, znajdziesz tego trochę ;]


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
little_MASTER
post 26.05.2009, 20:42:50
Post #3





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 8.12.2008

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


Przeglądałem już troszkę google, ale nie ma takich rozwiązań jakie bym chciał, szczególnie wsuwanie całej kategorii w inną.
Go to the top of the page
+Quote Post
erix
post 26.05.2009, 20:50:46
Post #4





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Czy ja mam inne Google?

http://blog.mwojcik.pl/2008/02/17/drzewa-k...-php-metoda-ip/


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
little_MASTER
post 26.05.2009, 21:01:31
Post #5





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 8.12.2008

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


Przeglądałem tą stronę. Ja mam strukturę id, parent_id, natomiast tam jest struktura ip. Taka drobna różnica...

Nie chciałbym zmieniać struktury całej bazy oraz tabel...
Go to the top of the page
+Quote Post
erix
post 27.05.2009, 12:19:22
Post #6





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




A może jednak? W Twoim przypadku wyciąganie dzieci wymagałoby N*rekurencyjnych zapytań... Przy większych strukturach miałbyś w chorobę UPDATE'ów.

Też miałem problem, ~Zyx mnie zjechał i miał rację. ;]


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
little_MASTER
post 28.05.2009, 02:37:09
Post #7





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 8.12.2008

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


Dokładnie. Samo generowanie drzewa wygląda tak:

  1. <?php
  2. function getItems($main_id)
  3.        {
  4.            $query   = &#092;"SELECT id,tytul FROM ksmisi_strony WHERE id_nadrzednej=\".$main_id.\" AND status=1 ORDER BY kolejnosc ASC\";
  5.            $result  = mysql_query($query) or die(&apos;Error&apos;);
  6.            return $result;
  7.        }
  8.    
  9.        function showItems($result)
  10.        {
  11.            echo &apos;<ul>&apos;;
  12.            while ($row = mysql_fetch_array ($result))
  13.            {
  14.                $id = $row[&#092;"id\"];                        
  15.                echo &apos;<li><a class=&#092;"link\" href=\"index.php?id=&apos;.$row[\"id\"].&apos;\">&apos;.$row[\"tytul\"].&apos;</a></li>&apos;;
  16.                $tmp = getItems($id);
  17.                showItems($tmp);        
  18.            }
  19.            echo &apos;</ul>&apos;;    
  20.        }        
  21.  
  22.        $result = getItems(0);
  23.        showItems($result);
  24. ?>


Tak samo z modyfikacją, tzn przenoszeniem kategorii do góry i na dół. w głąb i na zewnątrz.

Zastanawia mnie samo wyświetlanie drzewa, czy nie da ray tego zrobić jednym zapytaniem??
Go to the top of the page
+Quote Post
erix
post 28.05.2009, 11:18:23
Post #8





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
Zastanawia mnie samo wyświetlanie drzewa, czy nie da ray tego zrobić jednym zapytaniem??

Da radę. Ale wówczas musisz zmodyfikować tabelę tak, aby zawierała również pole kolejność; wówczas możesz wygenerować drzewko jednym zapytaniem.

Poszukaj, bo temat drzew kategorii jest dość często poruszany.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
little_MASTER
post 29.05.2009, 17:26:03
Post #9





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 8.12.2008

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


Kolumna kolejność jest jak najbardziej, ale poszperam jeszcze po forum, albo sam coś popróbuje.
Będę pokazywał kod, najwyżej dostanę opr za brak optymalizacji i trywialne rozwiązanie smile.gif

Próbuje zrobić przesuwanie kategorii w głąb drzewa, tzn kategorie której id podaje chce wsunąć w głąb kategorii która jest powyżej

Tabela wyglada tak:

nazwa |id|id_nadrzednej|kolenosc
AAA |1|0 |1
BBB |3|0 |2
ghi |7|3 |1
jkl |8|7 |1
mno |6|8 |1
CCC |5|0 |3
pqr |9|5 |1

A chciałbym aby wyglądała tak:

nazwa |id|id_nadrzednej|kolenosc
AAA |1|0 |1
BBB |3|0 |2
ghi |7|3 |1
jkl |8|7 |1
mno |6|8 |1
CCC |5|3 |3
pqr |9|5 |1


Czyli dla CCC zmieniamy id_nadrzednej i kolejnosc

Dla id=5 (strona CCC) id nadrzędnej muszę ustawić na 3.

Zapytanie które pobiera mi id kategorii nad nią wygląda tak:

  1. SELECT id FROM `ksmisi_strony` WHERE id_nadrzednej=
  2. (SELECT id_nadrzednej FROM `ksmisi_strony` WHERE id=5) AND kolejnosc<
  3. (SELECT kolejnosc FROM `ksmisi_strony` WHERE id=5) ORDER BY kolejnosc DESC LIMIT 1


(proszę o pomoc z optymalizacją)

Zapytanie które zwraca kolejność ostatniego elementu w kategorii do której chce wsunąć moją stronę wygląda tak:

  1. SELECT kolejnosc FROM `ksmisi_strony` WHERE id_nadrzednej =
  2. (SELECT id FROM `ksmisi_strony` WHERE id_nadrzednej=
  3. (SELECT id_nadrzednej FROM `ksmisi_strony` WHERE id=5) AND kolejnosc<
  4. (SELECT kolejnosc FROM `ksmisi_strony` WHERE id=5) ORDER BY kolejnosc DESC LIMIT 1 )
  5. ORDER BY kolejnosc DESC LIMIT 1


kiedy próbuje to zmontować do jednego update'a wyskakuje mi błąd że nei mogę w update wstawić select from.

Pomóżcie jakoś to złożyć w całość sadsmiley02.gif

Doczytałem przed chwilą że w update nie można robić selecta z tej samej tabeli :/

Ten post edytował little_MASTER 29.05.2009, 17:13:47
Go to the top of the page
+Quote Post
erix
post 29.05.2009, 18:40:16
Post #10





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
Kolumna kolejność jest jak najbardziej, ale poszperam jeszcze po forum, albo sam coś popróbuje.

Miałem na myśli kolejność idącą 1,2,3... niezależnie od stopnia zagłębienia. Wówczas będziesz mógł pobrać punkty skrajne i wykonać bezproblemowe UPDATE.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
little_MASTER
post 4.06.2009, 01:50:44
Post #11





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 8.12.2008

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


Zrobiłem podnoszenie stron o jeden do góry i na dół.
Bazowałem się na http://forum.php.pl/index.php?showtopic=80...rt=#entry410773
Może komuś się przyda smile.gif

  1. <?php
  2. function SitesOneUp($id)
  3.    {
  4.        $query = "UPDATE ksmisi_strony c, ( (SELECT id, ord.kolejnosc
  5.                    FROM ksmisi_strony, ((SELECT kolejnosc
  6.                    FROM ksmisi_strony WHERE kolejnosc < (SELECT kolejnosc
  7.                    FROM ksmisi_strony WHERE id = " . $id . " LIMIT 1 )
  8.                    AND id_nadrzednej=(SELECT id_nadrzednej FROM ksmisi_strony WHERE id = " . $id . " LIMIT 1))
  9.                    ORDER BY kolejnosc DESC LIMIT 1 ) AS ord
  10.                    WHERE id = " . $id . ")
  11.                    UNION
  12.                    (SELECT c1.id, ord.kolejnosc FROM ksmisi_strony c1,
  13.                    (SELECT kolejnosc FROM ksmisi_strony WHERE id = " . $id . ") as ord
  14.                       WHERE c1.kolejnosc < ord.kolejnosc
  15.                       AND c1.id_nadrzednej=(SELECT id_nadrzednej FROM ksmisi_strony WHERE id = " . $id . ")
  16.                      ORDER BY c1.kolejnosc DESC LIMIT 1 )) AS nowe_dane
  17.                    SET c.kolejnosc = nowe_dane.kolejnosc
  18.                    WHERE c.id = nowe_dane.id ";
  19.        $result = mysql_query($query) or die('Error');
  20.    }
  21.    function SitesOneDown($id)
  22.    {
  23.        $query = "UPDATE ksmisi_strony c, ( (SELECT id, ord.kolejnosc
  24.                    FROM ksmisi_strony, ((SELECT kolejnosc
  25.                    FROM ksmisi_strony WHERE kolejnosc > (SELECT kolejnosc
  26.                    FROM ksmisi_strony WHERE id = " . $id . " LIMIT 1 )
  27.                    AND id_nadrzednej=(SELECT id_nadrzednej FROM ksmisi_strony WHERE id = " . $id . " LIMIT 1))
  28.                    ORDER BY kolejnosc ASC LIMIT 1 ) AS ord
  29.                    WHERE id = " . $id . ")
  30.                    UNION
  31.                    (SELECT c1.id, ord.kolejnosc FROM ksmisi_strony c1,
  32.                    (SELECT kolejnosc FROM ksmisi_strony WHERE id = " . $id . ") as ord
  33.                       WHERE c1.kolejnosc > ord.kolejnosc
  34.                       AND c1.id_nadrzednej=(SELECT id_nadrzednej FROM ksmisi_strony WHERE id = " . $id . ")
  35.                       ORDER BY c1.kolejnosc ASC LIMIT 1 )) AS nowe_dane
  36.                    SET c.kolejnosc = nowe_dane.kolejnosc
  37.                    WHERE c.id = nowe_dane.id";
  38.        $result = mysql_query($query) or die('Error');
  39.    }
  40. ?>


Jako atrybut podajemy id strony która ma mieć zmienioną kolejność.

Jeśli jakaś optymalizacja byłaby mozliwa to proszę o podpowiedzi.
U mnie działa jak najbardziej.
Go to the top of the page
+Quote Post
erix
post 4.06.2009, 17:30:48
Post #12





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Czemu masz opory przed dodatkową kolumną określającą pozycję...?

Twoją funkcję trzeba wykonywać N-razy w zależności od przesunięć...


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
little_MASTER
post 7.06.2009, 21:34:44
Post #13





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 8.12.2008

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


Taką baze zaakceptował mi wykładowca, dlatego nie mogę dopisywać kolumn, to po pierwsze, a po drugie ja robie tylko admina, stronę ogólenie dostepną programuje druga osoba i nie chce wprowadzać kolejnych zmian.

Wiem, wyjście nie ciekawe, ale w drugiej wersji cms'a dorzuce lepsze drzewo, bo faktycznie zapytanie trzeba wykonywać wiele razy.

Jutro postaram się dorzucić kod na wsuwanie stron do kategorii i na odwrót.

Ale z tym to będę prosił już o pomoc z optymalizacją smile.gif

A tak na marginesie erix jak wygląda sprawa z certyfikatami zenda, gdzie pisałeś egzamin, jak z ceną questionmark.gif
Wiem teraz to za wcześnie o tym mysleć, wile książek i pisania przede mną, ale przyznam że fajnie by było się sprawdzić z takim czymś smile.gif

Ten post edytował little_MASTER 7.06.2009, 21:37:16
Go to the top of the page
+Quote Post
erix
post 7.06.2009, 21:51:47
Post #14





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
Taką baze zaakceptował mi wykładowca, dlatego nie mogę dopisywać kolumn, to po pierwsze, a po drugie ja robie tylko admina, stronę ogólenie dostepną programuje druga osoba i nie chce wprowadzać kolejnych zmian.

Ale takie rozwiązanie zajeździ bazę... Jak będziesz miał N poziomów zagnieżdżeń, to będzie katastrofalne...

Cytat
A tak na marginesie erix jak wygląda sprawa z certyfikatami zenda, gdzie pisałeś egzamin, jak z ceną
Wiem teraz to za wcześnie o tym mysleć, wile książek i pisania przede mną, ale przyznam że fajnie by było się sprawdzić z takim czymś

A PW nie znasz? tongue.gif


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
little_MASTER
post 13.09.2009, 21:48:39
Post #15





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 8.12.2008

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


Ok wracamy do tematu :/

Nadal męczę się z tym przenoszeniem w głąb i na zewnątrz.
Taka przerwa w temacie bo po prostu pracowałem w wakacje i jakoś nie było czasu.

  1. SELECT id FROM ksmisi_strony WHERE id_nadrzednej=(SELECT id_nadrzednej FROM ksmisi_strony WHERE id=2) AND kolejnosc<(SELECT kolejnosc FROM ksmisi_strony WHERE id=2) ORDER BY kolejnosc DESC LIMIT 1


To daje nowe id_nadrzednej, a to:

  1. SELECT IF ((SELECT kolejnosc FROM ksmisi_strony WHERE id_nadrzednej=2 ORDER BY kolejnosc DESC LIMIT 1),(SELECT kolejnosc FROM ksmisi_strony WHERE id_nadrzednej=2 ORDER BY kolejnosc DESC LIMIT 1) +1,1) AS kolejnosc


nową kolejność.

Kiedy próbuje to wszystko wrzucić w update'a to mam komunikat że nie mogę robić update i select z tej samej tabeli jednocześnie :/

Nie wiem jak się za to zabrać dry.gif

Tak samo sprawa wygląda z "wyciąganiem" podstrony na zewnątrz.
Chciałbym żeby wszystko działało na jednym zapytaniu, bo dwoma lub trzema jestem w stanie to zrobić bez problemu, ale nie o to chodzi.


Co do struktury to wiem ze jest najprostsza z możliwych. Strona do której będzie to wykorzystywane będzie niewielka, max kilka stron i 2 poziomy zagnieżdżeń.

Dzięki za radę winksmiley.jpg
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: 14.08.2025 - 06:42