Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL] Sortowanie rekordów (góra/dół)
in5ane
post 11.12.2012, 11:35:32
Post #1





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

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


Cześć, chciałem zrobić sobie sortowanie rekordów poprzez przyciski góra/dół. Jednakże coś mi to nie prądzi, tak jak powinno. Oto mój przykład:
BAZA
id || title || position (typ: float)

KOD
  1. if (isset($_GET['up'])) {
  2. $id = $_GET['up'];
  3. $query = mysql_query("SELECT position FROM category_menu WHERE id < $id LIMIT 1;");
  4. $row = mysql_fetch_array($query);
  5. $pos_p = $row['position'];
  6. $pos_n = $pos_p+0.0001;
  7. mysql_query("UPDATE category_menu SET position = $pos_n WHERE id = $id;");
  8. }
  9.  
  10. if (isset($_GET['down'])) {
  11. $id = $_GET['down'];
  12. $query = mysql_query("SELECT position FROM category_menu WHERE id > $id LIMIT 1;");
  13. $row = mysql_fetch_array($query);
  14. $pos_p = $row['position'];
  15. $pos_n = $pos_p+0.0001;
  16. mysql_query("UPDATE category_menu SET position = $pos_n WHERE id = $id;");
  17. }
  18. .......................
  19. <a href="index.php?page=2&up='.$row['id'].'">UP</a>
  20. <a href="index.php?page=2&down='.$row['id'].'">DOWN</a>


Pomożecie z tym? Nie wiem, co jest nie tak. Źle w ogóle wpisuje mi te pozycje. Dodaje sobie 0.0001, bo to tak to przy mojej ilości danych się na pewno nie zdubluje.

Ten post edytował in5ane 11.12.2012, 11:36:14


--------------------
> > > Tworzenie stron < < <
Go to the top of the page
+Quote Post
nospor
post 11.12.2012, 11:59:05
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




1) Pozycja typu całkowitego
2) Algorytm:
masz id do przeniesienia.
pobierasz id rekordu obok (dol lub gora)
zamieniasz wartosci POZYCJA obu rekordów
i po sprawie

zas co do bledow w twoim kodzie:
1)
$pos_n = $pos_p+0.0001; dodajesz niezależnie czy to góra czy dół
2) W zapytaniu musisz dodać ....ORDER BY id asc, gdyż baza niekoniecznie musi ci sortować rekordu wg. twojego założenia.

3)
WHERE id < $id
Skoro pozycje określa pole POZYCJA to nie możesz brać rekordu mniejszego po ID, gdyż on wcale nie musi być mniejszy, ale ma być mniejszy po POZYCJA. Wówczas i do sortowania dajesz POZYCJA a nie ID


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
in5ane
post 11.12.2012, 14:03:47
Post #3





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

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


Zrobiłem sobie coś takiego, ale teraz zauważyłem, że jak chce ostatni rekord (z ostatnim position) podnieść do góry, to on zamienia się pozycją z pierwszym rekordem. Co robię nie tak?
  1. if (isset($_GET['up'])) {
  2. $id = $_GET['up'];
  3. $query = mysql_query("SELECT position FROM category_menu WHERE id = $id;");
  4. $row = mysql_fetch_array($query);
  5. $pos = $row['position'];
  6. $query = mysql_query("SELECT id, position FROM category_menu WHERE position < $pos ORDER BY position ASC LIMIT 1;");
  7. $row = mysql_fetch_array($query);
  8. $id_n = $row['id'];
  9. $pos_n = $row['position'];
  10. mysql_query("UPDATE category_menu SET position = $pos_n WHERE id = $id;");
  11. mysql_query("UPDATE category_menu SET position = $pos WHERE id = $id_n;");
  12. }
  13. if (isset($_GET['down'])) {
  14. $id = $_GET['down'];
  15. $query = mysql_query("SELECT position FROM category_menu WHERE id = $id;");
  16. $row = mysql_fetch_array($query);
  17. $pos = $row['position'];
  18. $query = mysql_query("SELECT id, position FROM category_menu WHERE position > $pos ORDER BY position ASC LIMIT 1;");
  19. $row = mysql_fetch_array($query);
  20. $id_n = $row['id'];
  21. $pos_n = $row['position'];
  22. mysql_query("UPDATE category_menu SET position = $pos_n WHERE id = $id;");
  23. mysql_query("UPDATE category_menu SET position = $pos WHERE id = $id_n;");
  24. }

Niestety nie mogę dać WHERE position < $pos-1 ponieważ może nie istnieć o 1 mniejsze, bo np. rekord był usunięty, więc chciałem zrobić z tym mniejsze większe, ale coś nie działa, jak należy.



@edit: Poradziłem sobie. Dla zainteresowanych, jak problem został rozwiązany już mówię. Otóż w przenoszeniu do góry zrobiłem sortowanie od tyłu (czyli nie ASC, a dałem DESC). Ot cała filozofia. Teraz działa poprawnie.

Ten post edytował in5ane 11.12.2012, 14:14:19


--------------------
> > > Tworzenie stron < < <
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 - 00:59