Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kolejność w bazie
Forum PHP.pl > Forum > PHP
Mody23
Witam!

Mam tabelę w bazie. Chodzi o to, że tabela ma wiele pól, ale ja mam pytanie co do jednego - order.
Załóżmy że mam w bazie rekordy o nazwie i order'ze kolejno:

TEST - 1
TESTER - 2
TESTT - 3
TESTERR - 4

I teraz chciałbym tym swobodnie sterować góra/dół, tzn.:

TEST - 1 - GÓRA/DÓŁ
TESTER - 2 - GÓRA/DÓŁ
TESTT - 3 - GÓRA/DÓŁ
TESTERR - 4 - GÓRA/DÓŁ

No i jak mógłbym tym sterować? Załóżmy, że chcę pole TESTT przesunąć w górę o jedną pozycję. Jak mam zrobić aby pole TESTT "zamieniło się" order'em z polem, które jest nad tym polem, czyli TESTER ?

Pozdr
sadistic_son
Jeśli dobrze zrozumiałem Twoje pytanie to najprościej wydawałoby się dodać nową kolumnę w bazie i tam wrzucać numerek kolejności, i porządkować wg tej kolumny, i w dowolnym momencie zmieniać kolejność poprzez zmianę cyfr w tej kolumnie.
Kostek.88
  1. SELECT id,order FROM tabela WHERE id = to_co_przesuwasz // nastepnie przypisujesz do zmiennej np. $pos
  2.  
  3. UPDATE tabela SET order=order+1 WHERE order=($pos-1)
  4. UPDATE tabela SET order=order-1 WHERE id = to_co_przesuwasz


Nie jestem pewien, czy dobrze, ale logika jest taka:

1. wybierasz pozycje elementu, ktory przesuwasz, w tym wypadku 3
2. ustawiasz pozycje +1 dla elementu znajdujacego sie o pozycje wyzej NIZ TEN KTORY PRZESUWASZ i masz dwie trojki
3. pozostaje odjac pozycje (3-1=2) od aktualnie przesuwanego elementu w gore.

W dol kombinujesz na odwrot, rusz glowa wink.gif

PS. Jesli masz pytania jak spreparowac link do pozycji w gore, to cos takiego

  1. <a href="plik.php?up=id_elementu">up</a>


Aha, a jak sprawdzic?

wrzuc na poczatek warunek if($_GET['up']) Jesli jest spelniony, to dajesz te zapytania. Ale... jeszcze wypadaloby zrobic

  1. header('Location: ' . str_replace('?up=' . $_GET['up'], '', $_SERVER['REQUEST_URI']) );


albo po prostu

  1. header('Location: plik.php');


Wowczas jak przesuniesz element w gore, to nie zostana Ci smieci w linku. Bo jak zostana i odswiezysz strone to sie dalej bedzie przesuwal ten element - wiadomo.
croc
Myślę, że to dobre rozwiązanie. smile.gif Zakładając oczywiście, że w bazie zawsze panuje porządek, tj. nie ma dziur w weight. Przy usuwaniu rekordów będzie trzeba poodejmować 1 od wag tam, gdzie waga jest większa od usuwanego elementu.
Kostek.88
Tak, masz racje smile.gif Pamietam jak kiedys cos takiego robilem. Jakiez bylo moje zdziwienie, gdy okazalo sie, ze nie wzialem pod uwage dziur... biggrin.gif Ale w zasadzie usuwanie proste

  1.  
  2. SELECT id, order FROM tabela WHERE id=twoje_id // przypisanie do zmiennej $pos
  3.  
  4. DELETE FROM tabela WHERE id=twoje_id
  5. UPDATE tabela SET position=position-1 WHERE position > $pos
  6.  


Jakos tak wink.gif
croc
Od czasu do czasu można sobie dla pewności wykonać skrypt "sprzątający" dziury:
  1. $query = mysql_query('SELECT id, weight FROM tabela ORDER BY weight ASC, id ASC');
  2. for($weight = 1; $row = mysql_fetch_assoc($query); ++$weight) {
  3. mysql_query('UPDATE tabela SET weight = '.$weight.' WHERE id = '.$row['id']);
  4. }

Ten krótki fragment kodu sprawi, że w bazie będziemy mieli wagi od 1 do n, bez dziur i bez dubli.
Kostek.88
Genialne w swej prostocie. Nic dodac, nic ujac smile.gif
Mody23
Dzięki panowie - ja zrobiłem tak, jeszcze zanim się wypowiedzieliście:

  1. $sql = "SELECT field_order
  2. FROM " . FIELDS_TABLE . "
  3. WHERE id = $id_form";
  4. $result = $db->sql_query($sql);
  5. while( $row = $db->sql_fetchrow($result) )
  6. {
  7. $orderr = $row['field_order'];
  8. }
  9.  
  10. $order = $orderr + 1;
  11. $orderp = $order - 1;
  12.  
  13. $sql = "SELECT id
  14. FROM " . FIELDS_TABLE . "
  15. WHERE field_order = $order";
  16. $result = $db->sql_query($sql);
  17. while( $row = $db->sql_fetchrow($result) )
  18. {
  19. $idorder = $row['id'];
  20. }
  21.  
  22. $sql = "UPDATE " . FIELDS_TABLE . "
  23. SET field_order = $orderp
  24. WHERE id = $idorder";
  25. if ( !($result = $db->sql_query($sql)) )
  26. {
  27. message_die(GENERAL_ERROR, 'jakis error', '', __LINE__, __FILE__, $sql);
  28. }
  29.  
  30. $sql = "UPDATE " . FIELDS_TABLE . "
  31. SET field_order = $order
  32. WHERE id = $id_form";
  33. if ( !($result = $db->sql_query($sql)) )
  34. {
  35. message_die(GENERAL_ERROR, 'jakis error', '', __LINE__, __FILE__, $sql);
  36. }



Tylko czy to będzie działać jak powinno?
Kostek.88
Hmmm... sprawdz po prostu wink.gif A jak nie bedzie dzialac, to zrob tak jak mowilismy. Wydaje mi sie, ze troszke (minimalnie) za bardzo skomplikowales problem. Ale moze sie myle. Nie mam czasu teraz na analize kodu...
croc
Twój kod jest po pierwsze niepotrzebnie pogmatwany, a po drugie nie uwzględnia dziur. Trochę dziwne pytać na forum, a i tak robić po swojemu i to źle smile.gif
Kostek.88
No coz... chlopina sam wspomnial, ze zrobil tak zanim sie wypowiedzielismy. Pewnie zakladal, ze wszyscy go wysmieja i sam probowal wink.gif No i teraz pewnie mu sie nie chce zmieniac, robic od poczatku, wiec pyta sie czy dobrze jest tak jak ma wink.gif
Mody23
Dokładnie, zrobiłem to sobie sam, zanim ktokolwiek tutaj się udzielił. Cóż, zrobię waszą metodą za chwilkę, dzięki wink.gif
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.